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}}));
158 env(did::setValid(carol));
176 auto const aliceOldBalance{env.balance(alice)};
177 auto const beckyOldBalance{env.balance(becky)};
193 env.balance(becky) ==
194 aliceOldBalance + beckyOldBalance - acctDelFee);
215 for (
int i = 0; i < 8; ++i)
219 auto const beckyOldBalance{env.balance(becky)};
220 auto const carolOldBalance{env.balance(carol)};
226 BEAST_EXPECT(env.closed()->exists(
230 BEAST_EXPECT(env.closed()->exists(
243 BEAST_EXPECT(!env.closed()->exists(
245 BEAST_EXPECT(!env.closed()->exists(
247 BEAST_EXPECT(!env.closed()->exists(
253 env.balance(becky) ==
254 carolOldBalance + beckyOldBalance - acctDelFee);
270 testcase(
"Directories");
276 env.fund(
XRP(10000), alice, gw);
280 for (
int i{0}; i < 45; ++i)
282 env(offer(alice, gw[
"USD"](1),
XRP(1)));
285 env.require(
offers(alice, 45));
293 BEAST_EXPECT(env.closed()->exists(aliceRootKey));
294 BEAST_EXPECT(env.closed()->exists(alicePageKey));
297 auto const acctDelFee{
drops(env.current()->fees().increment)};
298 auto const aliceBalance{env.balance(alice)};
304 BEAST_EXPECT(!env.closed()->exists(aliceRootKey));
305 BEAST_EXPECT(!env.closed()->exists(alicePageKey));
313 testcase(
"Owned types");
325 env.fund(
XRP(100000), alice, becky, gw);
331 for (
int i{0}; i < 200; ++i)
333 env(offer(alice, gw[
"USD"](1),
XRP(1)));
334 env(offer(becky, gw[
"USD"](1),
XRP(1)));
337 env.require(
offers(alice, 200));
338 env.require(
offers(becky, 200));
349 env(check::create(alice, becky,
XRP(1)));
352 auto const acctDelFee{
drops(env.current()->fees().increment)};
360 env(check::cancel(becky, checkId));
369 jv[jss::TransactionType] = jss::EscrowCreate;
371 jv[jss::Account] = account.human();
372 jv[jss::Destination] = to.human();
375 cancelAfter.time_since_epoch().count() + 1;
377 cancelAfter.time_since_epoch().count() + 2;
381 using namespace std::chrono_literals;
383 env(escrowCreate(alice, becky,
XRP(333), env.now() + 2s));
399 jv[jss::TransactionType] = jss::EscrowCancel;
401 jv[jss::Account] = account.human();
406 env(escrowCancel(becky, alice, escrowSeq));
409 Keylet const alicePayChanKey{
413 alice, becky,
XRP(57), 4s, env.now() + 2s, alice.
pk()));
419 auto const beckyBalance{env.balance(becky)};
430 Keylet const& payChanKeylet,
433 jv[jss::TransactionType] = jss::PaymentChannelClaim;
435 jv[jss::Account] = account.human();
440 env(payChanClose(alice, alicePayChanKey, alice.
pk()));
462 env(payChanClose(alice, gwPayChanKey, alice.
pk()));
466 auto const aliceBalance{env.balance(alice)};
480 testcase(
"Resurrection");
488 env.fund(
XRP(10000), alice, becky);
493 BEAST_EXPECT(env.closed()->exists(beckyAcctKey));
495 using namespace std::chrono_literals;
497 auto const payChanXRP =
XRP(37);
500 alice, becky, payChanXRP, 4s, env.now() + 1h, alice.
pk()));
502 BEAST_EXPECT(env.closed()->exists(payChanKey));
507 auto const beckyPreDelBalance{env.balance(becky)};
509 auto const acctDelFee{
drops(env.current()->fees().increment)};
515 BEAST_EXPECT(!env.closed()->exists(beckyAcctKey));
521 drops(env.current()->fees().accountReserve(0)) -
XRP(1)),
526 env(pay(alice, becky,
XRP(10)));
530 BEAST_EXPECT(env.closed()->exists(beckyAcctKey));
531 BEAST_EXPECT(env.balance(becky) ==
XRP(10));
535 auto payChanClaim = [&]() {
537 jv[jss::TransactionType] = jss::PaymentChannelClaim;
539 jv[jss::Account] = alice.
human();
548 BEAST_EXPECT(env.balance(becky) ==
XRP(10) + payChanXRP);
558 testcase(
"Amendment enable");
564 env.fund(
XRP(10000), alice, becky);
572 BEAST_EXPECT(env.closed()->exists(aliceAcctKey));
574 auto const alicePreDelBal{env.balance(alice)};
575 auto const beckyPreDelBal{env.balance(becky)};
577 auto const acctDelFee{
drops(env.current()->fees().increment)};
583 BEAST_EXPECT(env.current()->exists(aliceAcctKey));
584 BEAST_EXPECT(env.balance(alice) == alicePreDelBal);
585 BEAST_EXPECT(env.balance(becky) == beckyPreDelBal);
593 BEAST_EXPECT(env.closed()->exists(aliceAcctKey));
597 BEAST_EXPECT(!env.current()->exists(aliceAcctKey));
599 env.balance(becky) == alicePreDelBal + beckyPreDelBal - acctDelFee);
602 BEAST_EXPECT(!env.closed()->exists(aliceAcctKey));
611 testcase(
"Too many offers");
618 env.fund(
XRP(10000000), alice, gw);
628 constexpr
int offerCount{1001};
629 for (
int i{0}; i < offerCount; ++i)
631 env(offer(alice, gw[currency](1),
XRP(1)));
636 if (currency[0] >
'Z')
641 if (currency[1] >
'Z')
646 if (currency[2] >
'Z')
662 BEAST_EXPECT(closed->exists(aliceOwnerDirKey));
666 BEAST_EXPECT(closed->exists(
keylet::page(aliceOwnerDirKey, i)));
676 auto const acctDelFee{
drops(env.current()->fees().increment)};
681 env.require(
offers(alice, offerCount));
684 env.require(
offers(alice, offerCount - 1));
687 auto const alicePreDelBal{env.balance(alice)};
697 BEAST_EXPECT(!closed->exists(aliceOwnerDirKey));
718 testcase(
"Implicitly created trust line");
723 auto const BUX{gw[
"BUX"]};
725 env.fund(
XRP(10000), alice, gw);
730 env(offer(alice, BUX(30),
XRP(30)));
734 env(offer(gw,
XRP(30), BUX(30)));
736 env.require(
balance(alice, BUX(30)));
743 auto const acctDelFee{
drops(env.current()->fees().increment)};
763 testcase(
"Balance too small for fee");
771 env.fund(env.current()->fees().accountReserve(0),
noripple(alice));
776 env(
noop(alice),
fee(env.balance(alice) -
XRP(1)));
779 auto const acctDelFee{
drops(env.current()->fees().increment)};
780 BEAST_EXPECT(acctDelFee > env.balance(alice));
786 auto const masterBalance{env.balance(env.master)};
794 BEAST_EXPECT(env.balance(env.master) == masterBalance);
799 BEAST_EXPECT(env.balance(alice) ==
XRP(1));
805 BEAST_EXPECT(env.balance(env.master) == masterBalance);
812 testcase(
"With Tickets");
814 using namespace test::jtx;
820 env.
fund(
XRP(100000), alice, bob);
825 env(ticket::create(bob, 250));
827 env.require(
owners(bob, 250));
844 auto const acctDelFee{
drops(env.current()->fees().increment)};
845 auto const bobOldBalance{env.balance(bob)};
863 testcase(
"Destination Constraints");
865 using namespace test::jtx;
873 env.
fund(
XRP(100000), alice, becky, carol);
890 auto const acctDelFee{
drops(env.current()->fees().increment)};
906 env(deposit::auth(alice, becky));
909 auto const beckyOldBalance{env.balance(becky)};