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);
132 auto const acctDelFee{
drops(env.current()->fees().increment)};
144 env(
trust(becky, gw[
"USD"](1000)));
149 env(deposit::auth(carol, becky));
151 env(offer(carol, gw[
"USD"](51),
XRP(51)));
153 env(ticket::create(carol, 1));
154 env(signers(carol, 1, {{alice, 1}, {becky, 1}}));
172 auto const aliceOldBalance{env.balance(alice)};
173 auto const beckyOldBalance{env.balance(becky)};
189 env.balance(becky) ==
190 aliceOldBalance + beckyOldBalance - acctDelFee);
201 auto const beckyOldBalance{env.balance(becky)};
202 auto const carolOldBalance{env.balance(carol)};
208 BEAST_EXPECT(env.closed()->exists(
212 BEAST_EXPECT(env.closed()->exists(
225 BEAST_EXPECT(!env.closed()->exists(
227 BEAST_EXPECT(!env.closed()->exists(
229 BEAST_EXPECT(!env.closed()->exists(
235 env.balance(becky) ==
236 carolOldBalance + beckyOldBalance - acctDelFee);
248 testcase(
"Directories");
254 env.fund(
XRP(10000), alice, gw);
258 for (
int i{0}; i < 45; ++i)
260 env(offer(alice, gw[
"USD"](1),
XRP(1)));
263 env.require(
offers(alice, 45));
271 BEAST_EXPECT(env.closed()->exists(aliceRootKey));
272 BEAST_EXPECT(env.closed()->exists(alicePageKey));
275 auto const acctDelFee{
drops(env.current()->fees().increment)};
276 auto const aliceBalance{env.balance(alice)};
282 BEAST_EXPECT(!env.closed()->exists(aliceRootKey));
283 BEAST_EXPECT(!env.closed()->exists(alicePageKey));
291 testcase(
"Owned types");
303 env.fund(
XRP(100000), alice, becky, gw);
309 for (
int i{0}; i < 200; ++i)
311 env(offer(alice, gw[
"USD"](1),
XRP(1)));
312 env(offer(becky, gw[
"USD"](1),
XRP(1)));
315 env.require(
offers(alice, 200));
316 env.require(
offers(becky, 200));
327 env(check::create(alice, becky,
XRP(1)));
330 auto const acctDelFee{
drops(env.current()->fees().increment)};
338 env(check::cancel(becky, checkId));
347 jv[jss::TransactionType] = jss::EscrowCreate;
349 jv[jss::Account] = account.human();
350 jv[jss::Destination] = to.human();
353 cancelAfter.time_since_epoch().count() + 1;
355 cancelAfter.time_since_epoch().count() + 2;
359 using namespace std::chrono_literals;
361 env(escrowCreate(alice, becky,
XRP(333), env.now() + 2s));
377 jv[jss::TransactionType] = jss::EscrowCancel;
379 jv[jss::Account] = account.human();
384 env(escrowCancel(becky, alice, escrowSeq));
387 Keylet const alicePayChanKey{
391 alice, becky,
XRP(57), 4s, env.now() + 2s, alice.
pk()));
397 auto const beckyBalance{env.balance(becky)};
408 Keylet const& payChanKeylet,
411 jv[jss::TransactionType] = jss::PaymentChannelClaim;
413 jv[jss::Account] = account.human();
418 env(payChanClose(alice, alicePayChanKey, alice.
pk()));
440 env(payChanClose(alice, gwPayChanKey, alice.
pk()));
444 auto const aliceBalance{env.balance(alice)};
458 testcase(
"Resurrection");
466 env.fund(
XRP(10000), alice, becky);
471 BEAST_EXPECT(env.closed()->exists(beckyAcctKey));
473 using namespace std::chrono_literals;
475 auto const payChanXRP =
XRP(37);
478 alice, becky, payChanXRP, 4s, env.now() + 1h, alice.
pk()));
480 BEAST_EXPECT(env.closed()->exists(payChanKey));
485 auto const beckyPreDelBalance{env.balance(becky)};
487 auto const acctDelFee{
drops(env.current()->fees().increment)};
493 BEAST_EXPECT(!env.closed()->exists(beckyAcctKey));
501 env(
pay(alice, becky,
XRP(20)));
505 BEAST_EXPECT(env.closed()->exists(beckyAcctKey));
506 BEAST_EXPECT(env.balance(becky) ==
XRP(20));
510 auto payChanClaim = [&]() {
512 jv[jss::TransactionType] = jss::PaymentChannelClaim;
514 jv[jss::Account] = alice.
human();
523 BEAST_EXPECT(env.balance(becky) ==
XRP(20) + payChanXRP);
533 testcase(
"Amendment enable");
539 env.fund(
XRP(10000), alice, becky);
547 BEAST_EXPECT(env.closed()->exists(aliceAcctKey));
549 auto const alicePreDelBal{env.balance(alice)};
550 auto const beckyPreDelBal{env.balance(becky)};
552 auto const acctDelFee{
drops(env.current()->fees().increment)};
558 BEAST_EXPECT(env.current()->exists(aliceAcctKey));
559 BEAST_EXPECT(env.balance(alice) == alicePreDelBal);
560 BEAST_EXPECT(env.balance(becky) == beckyPreDelBal);
568 BEAST_EXPECT(env.closed()->exists(aliceAcctKey));
572 BEAST_EXPECT(!env.current()->exists(aliceAcctKey));
574 env.balance(becky) == alicePreDelBal + beckyPreDelBal - acctDelFee);
577 BEAST_EXPECT(!env.closed()->exists(aliceAcctKey));
586 testcase(
"Too many offers");
593 env.fund(
XRP(10000000), alice, gw);
603 constexpr
int offerCount{1001};
604 for (
int i{0}; i < offerCount; ++i)
606 env(offer(alice, gw[currency](1),
XRP(1)));
611 if (currency[0] >
'Z')
616 if (currency[1] >
'Z')
621 if (currency[2] >
'Z')
637 BEAST_EXPECT(closed->exists(aliceOwnerDirKey));
641 BEAST_EXPECT(closed->exists(
keylet::page(aliceOwnerDirKey, i)));
651 auto const acctDelFee{
drops(env.current()->fees().increment)};
656 env.require(
offers(alice, offerCount));
659 env.require(
offers(alice, offerCount - 1));
662 auto const alicePreDelBal{env.balance(alice)};
672 BEAST_EXPECT(!closed->exists(aliceOwnerDirKey));
693 testcase(
"Implicitly created trust line");
698 auto const BUX{gw[
"BUX"]};
700 env.fund(
XRP(10000), alice, gw);
705 env(offer(alice, BUX(30),
XRP(30)));
709 env(offer(gw,
XRP(30), BUX(30)));
711 env.require(
balance(alice, BUX(30)));
718 auto const acctDelFee{
drops(env.current()->fees().increment)};
738 testcase(
"Balance too small for fee");
746 env.fund(env.current()->fees().accountReserve(0),
noripple(alice));
751 env(
noop(alice),
fee(env.balance(alice) -
XRP(1)));
754 auto const acctDelFee{
drops(env.current()->fees().increment)};
755 BEAST_EXPECT(acctDelFee > env.balance(alice));
761 auto const masterBalance{env.balance(env.master)};
769 BEAST_EXPECT(env.balance(env.master) == masterBalance);
774 BEAST_EXPECT(env.balance(alice) ==
XRP(1));
780 BEAST_EXPECT(env.balance(env.master) == masterBalance);
787 testcase(
"With Tickets");
789 using namespace test::jtx;
795 env.
fund(
XRP(100000), alice, bob);
800 env(ticket::create(bob, 250));
802 env.require(
owners(bob, 250));
819 auto const acctDelFee{
drops(env.current()->fees().increment)};
820 auto const bobOldBalance{env.balance(bob)};