20 #include <ripple/protocol/Feature.h>
21 #include <ripple/protocol/jss.h>
49 Json::Value const meta = env.
rpc (
"tx", txHash)[jss::result][jss::meta];
59 BEAST_EXPECT (meta[jss::delivered_amount] == jsonExpect);
72 jv[jss::TransactionType] = jss::PaymentChannelCreate;
73 jv[jss::Account] = account.human();
74 jv[jss::Destination] = to.
human();
92 int const delta = [&]()->
int{
97 BEAST_EXPECT(margin==0 || delta >= 0);
98 for (
int i = 0; i < delta; ++i)
116 env.fund(
XRP(10000), alice, becky, carol, gw);
128 auto const acctDelFee {
drops (env.current()->fees().increment)};
139 env (
trust (becky, gw[
"USD"](1000)));
144 env (deposit::auth (carol, becky));
146 env (
offer (carol, gw[
"USD"](51),
XRP (51)));
147 env (
signers (carol, 1, {{alice, 1}, {becky, 1}}));
165 auto const aliceOldBalance {env.balance (alice)};
166 auto const beckyOldBalance {env.balance (becky)};
181 BEAST_EXPECT (env.balance (becky) ==
182 aliceOldBalance + beckyOldBalance - acctDelFee);
194 auto const beckyOldBalance {env.balance (becky)};
195 auto const carolOldBalance {env.balance (carol)};
202 carol.
id(), becky.
id())));
204 carol.
id(), carolOfferSeq)));
217 carol.
id(), becky.
id())));
219 carol.
id(), carolOfferSeq)));
223 BEAST_EXPECT (env.balance (becky) ==
224 carolOldBalance + beckyOldBalance - acctDelFee);
235 testcase(
"Directories");
241 env.fund(
XRP(10000), alice, gw);
245 for (
int i {0}; i < 45; ++i)
247 env (
offer (alice, gw[
"USD"](1),
XRP (1)));
250 env.require (
offers (alice, 45));
258 BEAST_EXPECT (env.closed()->exists (aliceRootKey));
259 BEAST_EXPECT (env.closed()->exists (alicePageKey));
262 auto const acctDelFee {
drops (env.current()->fees().increment)};
263 auto const aliceBalance {env.balance (alice)};
269 BEAST_EXPECT (! env.closed()->exists (aliceRootKey));
270 BEAST_EXPECT (! env.closed()->exists (alicePageKey));
277 testcase(
"Owned types");
289 env.fund(
XRP(100000), alice, becky, gw);
295 for (
int i {0}; i < 200; ++i)
297 env (
offer (alice, gw[
"USD"](1),
XRP (1)));
298 env (
offer (becky, gw[
"USD"](1),
XRP (1)));
301 env.require (
offers (alice, 200));
302 env.require (
offers (becky, 200));
313 env (check::create (alice, becky,
XRP (1)));
316 auto const acctDelFee {
drops (env.current()->fees().increment)};
324 env (check::cancel (becky, checkId));
328 auto escrowCreate = [] (
333 jv[jss::TransactionType] = jss::EscrowCreate;
335 jv[jss::Account] = account.human();
336 jv[jss::Destination] = to.human();
339 cancelAfter.time_since_epoch().count() + 1;
341 cancelAfter.time_since_epoch().count() + 2;
345 using namespace std::chrono_literals;
347 env (escrowCreate (alice, becky,
XRP(333), env.now() + 2s));
360 auto escrowCancel = [] (
Account const& account,
364 jv[jss::TransactionType] = jss::EscrowCancel;
366 jv[jss::Account] = account.human();
371 env (escrowCancel (becky, alice, escrowSeq));
374 Keylet const alicePayChanKey {
378 alice, becky,
XRP(57), 4s, env.now() + 2s, alice.
pk()));
384 auto const beckyBalance {env.balance (becky)};
394 auto payChanClose = [] (
396 Keylet const& payChanKeylet,
400 jv[jss::TransactionType] = jss::PaymentChannelClaim;
402 jv[jss::Account] = account.human();
407 env (payChanClose (alice, alicePayChanKey, alice.
pk()));
421 gw, alice,
XRP(68), 4s, env.now() + 2s, alice.
pk()));
430 env (payChanClose (alice, gwPayChanKey, alice.
pk()));
434 auto const aliceBalance {env.balance (alice)};
447 testcase(
"Resurrection");
455 env.fund(
XRP(10000), alice, becky);
460 BEAST_EXPECT (env.closed()->exists (beckyAcctKey));
462 using namespace std::chrono_literals;
465 auto const payChanXRP =
XRP (37);
468 alice, becky, payChanXRP, 4s, env.now() + 1h, alice.
pk()));
470 BEAST_EXPECT (env.closed()->exists (payChanKey));
475 auto const beckyPreDelBalance {env.balance (becky)};
477 auto const acctDelFee {
drops (env.current()->fees().increment)};
480 env, beckyPreDelBalance - acctDelFee);
484 BEAST_EXPECT (! env.closed()->exists (beckyAcctKey));
492 env (
pay (alice, becky,
XRP (20)));
496 BEAST_EXPECT (env.closed()->exists (beckyAcctKey));
497 BEAST_EXPECT (env.balance (becky) ==
XRP (20));
501 auto payChanClaim = [&] ()
504 jv[jss::TransactionType] = jss::PaymentChannelClaim;
506 jv[jss::Account] = alice.
human ();
512 env (payChanClaim());
515 BEAST_EXPECT (env.balance (becky) ==
XRP (20) + payChanXRP);
524 testcase(
"Amendment enable");
530 env.fund(
XRP(10000), alice, becky);
538 BEAST_EXPECT (env.closed()->exists (aliceAcctKey));
540 auto const alicePreDelBal {env.balance (alice)};
541 auto const beckyPreDelBal {env.balance (becky)};
543 auto const acctDelFee {
drops (env.current()->fees().increment)};
549 BEAST_EXPECT (env.current()->exists (aliceAcctKey));
550 BEAST_EXPECT (env.balance (alice) == alicePreDelBal);
551 BEAST_EXPECT (env.balance (becky) == beckyPreDelBal);
559 BEAST_EXPECT (env.closed()->exists (aliceAcctKey));
563 BEAST_EXPECT (! env.current()->exists (aliceAcctKey));
564 BEAST_EXPECT (env.balance (becky) ==
565 alicePreDelBal + beckyPreDelBal - acctDelFee);
568 BEAST_EXPECT (! env.closed()->exists (aliceAcctKey));
576 testcase(
"Too many offers");
583 env.fund(
XRP(10000000), alice, gw);
593 constexpr
int offerCount {1001};
594 for (
int i {0}; i < offerCount; ++i)
596 env (
offer (alice, gw[currency](1),
XRP (1)));
601 if (currency[0] >
'Z')
606 if (currency[1] >
'Z')
611 if (currency[2] >
'Z')
627 BEAST_EXPECT (closed->exists (aliceOwnerDirKey));
631 BEAST_EXPECT (closed->exists (
636 BEAST_EXPECT (closed->exists (
642 auto const acctDelFee {
drops (env.current()->fees().increment)};
647 env.require (
offers (alice, offerCount));
650 env.require (
offers (alice, offerCount - 1));
653 auto const alicePreDelBal {env.balance (alice)};
663 BEAST_EXPECT (! closed->exists (aliceOwnerDirKey));
667 BEAST_EXPECT (! closed->exists (
672 BEAST_EXPECT (! closed->exists (
683 testcase(
"Implicitly created trust line");
688 auto const BUX {gw[
"BUX"]};
690 env.fund(
XRP(10000), alice, gw);
695 env (
offer (alice, BUX(30),
XRP(30)));
701 env.require (
balance (alice, BUX(30)));
708 auto const acctDelFee {
drops (env.current()->fees().increment)};
727 testcase(
"Balance too small for fee");
735 env.fund (env.current()->fees().accountReserve(0),
noripple (alice));
740 env (
noop (alice),
fee (env.balance(alice) -
XRP(1)));
743 auto const acctDelFee {
drops (env.current()->fees().increment)};
744 BEAST_EXPECT (acctDelFee > env.balance (alice));
750 auto const masterBalance {env.balance (env.master)};
757 BEAST_EXPECT (env.balance (env.master) == masterBalance);
762 BEAST_EXPECT (env.balance (alice) ==
XRP (1));
769 BEAST_EXPECT (env.balance (env.master) == masterBalance);