20 #include <ripple/protocol/Feature.h>
21 #include <ripple/protocol/jss.h>
51 Json::Value const meta = env.
rpc(
"tx", txHash)[jss::result][jss::meta];
61 BEAST_EXPECT(meta[jss::delivered_amount] == jsonExpect);
75 jv[jss::TransactionType] = jss::PaymentChannelCreate;
76 jv[jss::Account] = account.human();
77 jv[jss::Destination] = to.
human();
94 int const delta = [&]() ->
int {
99 BEAST_EXPECT(margin == 0 || delta >= 0);
100 for (
int i = 0; i < delta; ++i)
119 env.fund(
XRP(10000), alice, becky, carol, gw);
135 auto const acctDelFee{
drops(env.current()->fees().increment)};
147 env(
trust(becky, gw[
"USD"](1000)));
152 env(deposit::auth(carol, becky));
154 env(offer(carol, gw[
"USD"](51),
XRP(51)));
156 env(ticket::create(carol, 1));
157 env(signers(carol, 1, {{alice, 1}, {becky, 1}}));
175 auto const aliceOldBalance{env.balance(alice)};
176 auto const beckyOldBalance{env.balance(becky)};
192 env.balance(becky) ==
193 aliceOldBalance + beckyOldBalance - acctDelFee);
214 for (
int i = 0; i < 8; ++i)
218 auto const beckyOldBalance{env.balance(becky)};
219 auto const carolOldBalance{env.balance(carol)};
225 BEAST_EXPECT(env.closed()->exists(
229 BEAST_EXPECT(env.closed()->exists(
242 BEAST_EXPECT(!env.closed()->exists(
244 BEAST_EXPECT(!env.closed()->exists(
246 BEAST_EXPECT(!env.closed()->exists(
252 env.balance(becky) ==
253 carolOldBalance + beckyOldBalance - acctDelFee);
269 testcase(
"Directories");
275 env.fund(
XRP(10000), alice, gw);
279 for (
int i{0}; i < 45; ++i)
281 env(offer(alice, gw[
"USD"](1),
XRP(1)));
284 env.require(
offers(alice, 45));
292 BEAST_EXPECT(env.closed()->exists(aliceRootKey));
293 BEAST_EXPECT(env.closed()->exists(alicePageKey));
296 auto const acctDelFee{
drops(env.current()->fees().increment)};
297 auto const aliceBalance{env.balance(alice)};
303 BEAST_EXPECT(!env.closed()->exists(aliceRootKey));
304 BEAST_EXPECT(!env.closed()->exists(alicePageKey));
312 testcase(
"Owned types");
324 env.fund(
XRP(100000), alice, becky, gw);
330 for (
int i{0}; i < 200; ++i)
332 env(offer(alice, gw[
"USD"](1),
XRP(1)));
333 env(offer(becky, gw[
"USD"](1),
XRP(1)));
336 env.require(
offers(alice, 200));
337 env.require(
offers(becky, 200));
348 env(check::create(alice, becky,
XRP(1)));
351 auto const acctDelFee{
drops(env.current()->fees().increment)};
359 env(check::cancel(becky, checkId));
368 jv[jss::TransactionType] = jss::EscrowCreate;
370 jv[jss::Account] = account.human();
371 jv[jss::Destination] = to.human();
374 cancelAfter.time_since_epoch().count() + 1;
376 cancelAfter.time_since_epoch().count() + 2;
380 using namespace std::chrono_literals;
382 env(escrowCreate(alice, becky,
XRP(333), env.now() + 2s));
398 jv[jss::TransactionType] = jss::EscrowCancel;
400 jv[jss::Account] = account.human();
405 env(escrowCancel(becky, alice, escrowSeq));
408 Keylet const alicePayChanKey{
412 alice, becky,
XRP(57), 4s, env.now() + 2s, alice.
pk()));
418 auto const beckyBalance{env.balance(becky)};
429 Keylet const& payChanKeylet,
432 jv[jss::TransactionType] = jss::PaymentChannelClaim;
434 jv[jss::Account] = account.human();
439 env(payChanClose(alice, alicePayChanKey, alice.
pk()));
461 env(payChanClose(alice, gwPayChanKey, alice.
pk()));
465 auto const aliceBalance{env.balance(alice)};
479 testcase(
"Resurrection");
487 env.fund(
XRP(10000), alice, becky);
492 BEAST_EXPECT(env.closed()->exists(beckyAcctKey));
494 using namespace std::chrono_literals;
496 auto const payChanXRP =
XRP(37);
499 alice, becky, payChanXRP, 4s, env.now() + 1h, alice.
pk()));
501 BEAST_EXPECT(env.closed()->exists(payChanKey));
506 auto const beckyPreDelBalance{env.balance(becky)};
508 auto const acctDelFee{
drops(env.current()->fees().increment)};
514 BEAST_EXPECT(!env.closed()->exists(beckyAcctKey));
522 env(
pay(alice, becky,
XRP(20)));
526 BEAST_EXPECT(env.closed()->exists(beckyAcctKey));
527 BEAST_EXPECT(env.balance(becky) ==
XRP(20));
531 auto payChanClaim = [&]() {
533 jv[jss::TransactionType] = jss::PaymentChannelClaim;
535 jv[jss::Account] = alice.
human();
544 BEAST_EXPECT(env.balance(becky) ==
XRP(20) + payChanXRP);
554 testcase(
"Amendment enable");
560 env.fund(
XRP(10000), alice, becky);
568 BEAST_EXPECT(env.closed()->exists(aliceAcctKey));
570 auto const alicePreDelBal{env.balance(alice)};
571 auto const beckyPreDelBal{env.balance(becky)};
573 auto const acctDelFee{
drops(env.current()->fees().increment)};
579 BEAST_EXPECT(env.current()->exists(aliceAcctKey));
580 BEAST_EXPECT(env.balance(alice) == alicePreDelBal);
581 BEAST_EXPECT(env.balance(becky) == beckyPreDelBal);
589 BEAST_EXPECT(env.closed()->exists(aliceAcctKey));
593 BEAST_EXPECT(!env.current()->exists(aliceAcctKey));
595 env.balance(becky) == alicePreDelBal + beckyPreDelBal - acctDelFee);
598 BEAST_EXPECT(!env.closed()->exists(aliceAcctKey));
607 testcase(
"Too many offers");
614 env.fund(
XRP(10000000), alice, gw);
624 constexpr
int offerCount{1001};
625 for (
int i{0}; i < offerCount; ++i)
627 env(offer(alice, gw[currency](1),
XRP(1)));
632 if (currency[0] >
'Z')
637 if (currency[1] >
'Z')
642 if (currency[2] >
'Z')
658 BEAST_EXPECT(closed->exists(aliceOwnerDirKey));
662 BEAST_EXPECT(closed->exists(
keylet::page(aliceOwnerDirKey, i)));
672 auto const acctDelFee{
drops(env.current()->fees().increment)};
677 env.require(
offers(alice, offerCount));
680 env.require(
offers(alice, offerCount - 1));
683 auto const alicePreDelBal{env.balance(alice)};
693 BEAST_EXPECT(!closed->exists(aliceOwnerDirKey));
714 testcase(
"Implicitly created trust line");
719 auto const BUX{gw[
"BUX"]};
721 env.fund(
XRP(10000), alice, gw);
726 env(offer(alice, BUX(30),
XRP(30)));
730 env(offer(gw,
XRP(30), BUX(30)));
732 env.require(
balance(alice, BUX(30)));
739 auto const acctDelFee{
drops(env.current()->fees().increment)};
759 testcase(
"Balance too small for fee");
767 env.fund(env.current()->fees().accountReserve(0),
noripple(alice));
772 env(
noop(alice),
fee(env.balance(alice) -
XRP(1)));
775 auto const acctDelFee{
drops(env.current()->fees().increment)};
776 BEAST_EXPECT(acctDelFee > env.balance(alice));
782 auto const masterBalance{env.balance(env.master)};
790 BEAST_EXPECT(env.balance(env.master) == masterBalance);
795 BEAST_EXPECT(env.balance(alice) ==
XRP(1));
801 BEAST_EXPECT(env.balance(env.master) == masterBalance);
808 testcase(
"With Tickets");
810 using namespace test::jtx;
816 env.
fund(
XRP(100000), alice, bob);
821 env(ticket::create(bob, 250));
823 env.require(
owners(bob, 250));
840 auto const acctDelFee{
drops(env.current()->fees().increment)};
841 auto const bobOldBalance{env.balance(bob)};
859 testcase(
"Destination Constraints");
861 using namespace test::jtx;
869 env.
fund(
XRP(100000), alice, becky, carol);
886 auto const acctDelFee{
drops(env.current()->fees().increment)};
902 env(deposit::auth(alice, becky));
905 auto const beckyOldBalance{env.balance(becky)};