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)));
152 env(signers(carol, 1, {{alice, 1}, {becky, 1}}));
170 auto const aliceOldBalance{env.balance(alice)};
171 auto const beckyOldBalance{env.balance(becky)};
187 env.balance(becky) ==
188 aliceOldBalance + beckyOldBalance - acctDelFee);
199 auto const beckyOldBalance{env.balance(becky)};
200 auto const carolOldBalance{env.balance(carol)};
206 BEAST_EXPECT(env.closed()->exists(
221 BEAST_EXPECT(!env.closed()->exists(
223 BEAST_EXPECT(!env.closed()->exists(
229 env.balance(becky) ==
230 carolOldBalance + beckyOldBalance - acctDelFee);
242 testcase(
"Directories");
248 env.fund(
XRP(10000), alice, gw);
252 for (
int i{0}; i < 45; ++i)
254 env(offer(alice, gw[
"USD"](1),
XRP(1)));
257 env.require(
offers(alice, 45));
265 BEAST_EXPECT(env.closed()->exists(aliceRootKey));
266 BEAST_EXPECT(env.closed()->exists(alicePageKey));
269 auto const acctDelFee{
drops(env.current()->fees().increment)};
270 auto const aliceBalance{env.balance(alice)};
276 BEAST_EXPECT(!env.closed()->exists(aliceRootKey));
277 BEAST_EXPECT(!env.closed()->exists(alicePageKey));
285 testcase(
"Owned types");
297 env.fund(
XRP(100000), alice, becky, gw);
303 for (
int i{0}; i < 200; ++i)
305 env(offer(alice, gw[
"USD"](1),
XRP(1)));
306 env(offer(becky, gw[
"USD"](1),
XRP(1)));
309 env.require(
offers(alice, 200));
310 env.require(
offers(becky, 200));
321 env(check::create(alice, becky,
XRP(1)));
324 auto const acctDelFee{
drops(env.current()->fees().increment)};
332 env(check::cancel(becky, checkId));
341 jv[jss::TransactionType] = jss::EscrowCreate;
343 jv[jss::Account] = account.human();
344 jv[jss::Destination] = to.human();
347 cancelAfter.time_since_epoch().count() + 1;
349 cancelAfter.time_since_epoch().count() + 2;
353 using namespace std::chrono_literals;
355 env(escrowCreate(alice, becky,
XRP(333), env.now() + 2s));
371 jv[jss::TransactionType] = jss::EscrowCancel;
373 jv[jss::Account] = account.human();
378 env(escrowCancel(becky, alice, escrowSeq));
381 Keylet const alicePayChanKey{
385 alice, becky,
XRP(57), 4s, env.now() + 2s, alice.
pk()));
391 auto const beckyBalance{env.balance(becky)};
402 Keylet const& payChanKeylet,
405 jv[jss::TransactionType] = jss::PaymentChannelClaim;
407 jv[jss::Account] = account.human();
412 env(payChanClose(alice, alicePayChanKey, alice.
pk()));
434 env(payChanClose(alice, gwPayChanKey, alice.
pk()));
438 auto const aliceBalance{env.balance(alice)};
452 testcase(
"Resurrection");
460 env.fund(
XRP(10000), alice, becky);
465 BEAST_EXPECT(env.closed()->exists(beckyAcctKey));
467 using namespace std::chrono_literals;
469 auto const payChanXRP =
XRP(37);
472 alice, becky, payChanXRP, 4s, env.now() + 1h, alice.
pk()));
474 BEAST_EXPECT(env.closed()->exists(payChanKey));
479 auto const beckyPreDelBalance{env.balance(becky)};
481 auto const acctDelFee{
drops(env.current()->fees().increment)};
487 BEAST_EXPECT(!env.closed()->exists(beckyAcctKey));
495 env(
pay(alice, becky,
XRP(20)));
499 BEAST_EXPECT(env.closed()->exists(beckyAcctKey));
500 BEAST_EXPECT(env.balance(becky) ==
XRP(20));
504 auto payChanClaim = [&]() {
506 jv[jss::TransactionType] = jss::PaymentChannelClaim;
508 jv[jss::Account] = alice.
human();
517 BEAST_EXPECT(env.balance(becky) ==
XRP(20) + payChanXRP);
527 testcase(
"Amendment enable");
533 env.fund(
XRP(10000), alice, becky);
541 BEAST_EXPECT(env.closed()->exists(aliceAcctKey));
543 auto const alicePreDelBal{env.balance(alice)};
544 auto const beckyPreDelBal{env.balance(becky)};
546 auto const acctDelFee{
drops(env.current()->fees().increment)};
552 BEAST_EXPECT(env.current()->exists(aliceAcctKey));
553 BEAST_EXPECT(env.balance(alice) == alicePreDelBal);
554 BEAST_EXPECT(env.balance(becky) == beckyPreDelBal);
562 BEAST_EXPECT(env.closed()->exists(aliceAcctKey));
566 BEAST_EXPECT(!env.current()->exists(aliceAcctKey));
568 env.balance(becky) == alicePreDelBal + beckyPreDelBal - acctDelFee);
571 BEAST_EXPECT(!env.closed()->exists(aliceAcctKey));
580 testcase(
"Too many offers");
587 env.fund(
XRP(10000000), alice, gw);
597 constexpr
int offerCount{1001};
598 for (
int i{0}; i < offerCount; ++i)
600 env(offer(alice, gw[currency](1),
XRP(1)));
605 if (currency[0] >
'Z')
610 if (currency[1] >
'Z')
615 if (currency[2] >
'Z')
631 BEAST_EXPECT(closed->exists(aliceOwnerDirKey));
635 BEAST_EXPECT(closed->exists(
keylet::page(aliceOwnerDirKey, i)));
645 auto const acctDelFee{
drops(env.current()->fees().increment)};
650 env.require(
offers(alice, offerCount));
653 env.require(
offers(alice, offerCount - 1));
656 auto const alicePreDelBal{env.balance(alice)};
666 BEAST_EXPECT(!closed->exists(aliceOwnerDirKey));
687 testcase(
"Implicitly created trust line");
692 auto const BUX{gw[
"BUX"]};
694 env.fund(
XRP(10000), alice, gw);
699 env(offer(alice, BUX(30),
XRP(30)));
703 env(offer(gw,
XRP(30), BUX(30)));
705 env.require(
balance(alice, BUX(30)));
712 auto const acctDelFee{
drops(env.current()->fees().increment)};
732 testcase(
"Balance too small for fee");
740 env.fund(env.current()->fees().accountReserve(0),
noripple(alice));
745 env(
noop(alice),
fee(env.balance(alice) -
XRP(1)));
748 auto const acctDelFee{
drops(env.current()->fees().increment)};
749 BEAST_EXPECT(acctDelFee > env.balance(alice));
755 auto const masterBalance{env.balance(env.master)};
763 BEAST_EXPECT(env.balance(env.master) == masterBalance);
768 BEAST_EXPECT(env.balance(alice) ==
XRP(1));
774 BEAST_EXPECT(env.balance(env.master) == masterBalance);