40        using namespace test::jtx;
 
   43        Account gw{
"gateway"};
 
   44        Account alice{
"alice"};
 
   47        env.fund(XRP(10000), gw, alice, bob);
 
   52        auto jrr = ledgerEntryState(env, gw, alice, 
"USD");
 
   53        BEAST_EXPECT(jrr[jss::error] == 
"entryNotFound");
 
   56        env(trust(alice, gw[
"USD"](800)));
 
   58        jrr = ledgerEntryState(env, gw, alice, 
"USD");
 
   59        BEAST_EXPECT(jrr[jss::node][sfBalance.fieldName][jss::value] == 
"0");
 
   61            jrr[jss::node][sfHighLimit.fieldName][jss::value] == 
"800");
 
   63            jrr[jss::node][sfHighLimit.fieldName][jss::issuer] ==
 
   66            jrr[jss::node][sfHighLimit.fieldName][jss::currency] == 
"USD");
 
   67        BEAST_EXPECT(jrr[jss::node][sfLowLimit.fieldName][jss::value] == 
"0");
 
   69            jrr[jss::node][sfLowLimit.fieldName][jss::issuer] == gw.human());
 
   71            jrr[jss::node][sfLowLimit.fieldName][jss::currency] == 
"USD");
 
   74        env(trust(alice, gw[
"USD"](700)));
 
   76        jrr = ledgerEntryState(env, gw, alice, 
"USD");
 
   77        BEAST_EXPECT(jrr[jss::node][sfBalance.fieldName][jss::value] == 
"0");
 
   79            jrr[jss::node][sfHighLimit.fieldName][jss::value] == 
"700");
 
   81            jrr[jss::node][sfHighLimit.fieldName][jss::issuer] ==
 
   84            jrr[jss::node][sfHighLimit.fieldName][jss::currency] == 
"USD");
 
   85        BEAST_EXPECT(jrr[jss::node][sfLowLimit.fieldName][jss::value] == 
"0");
 
   87            jrr[jss::node][sfLowLimit.fieldName][jss::issuer] == gw.human());
 
   89            jrr[jss::node][sfLowLimit.fieldName][jss::currency] == 
"USD");
 
   95        env(trust(alice, gw[
"USD"](0)));
 
   98        jrr = ledgerEntryState(env, gw, alice, 
"USD");
 
   99        BEAST_EXPECT(jrr[jss::error] == 
"entryNotFound");
 
  104        env(trust(alice, bob[
"USD"](600)));
 
  107        env(trust(bob, alice[
"USD"](500)));
 
  110        jrr = ledgerEntryState(env, alice, bob, 
"USD");
 
  111        BEAST_EXPECT(jrr[jss::node][sfBalance.fieldName][jss::value] == 
"0");
 
  113            jrr[jss::node][sfHighLimit.fieldName][jss::value] == 
"500");
 
  115            jrr[jss::node][sfHighLimit.fieldName][jss::issuer] == bob.human());
 
  117            jrr[jss::node][sfHighLimit.fieldName][jss::currency] == 
"USD");
 
  118        BEAST_EXPECT(jrr[jss::node][sfLowLimit.fieldName][jss::value] == 
"600");
 
  120            jrr[jss::node][sfLowLimit.fieldName][jss::issuer] == alice.human());
 
  122            jrr[jss::node][sfLowLimit.fieldName][jss::currency] == 
"USD");
 
 
  129        using namespace test::jtx;
 
  131        Env env{*
this, features};
 
  132        Account alice{
"alice"};
 
  135        env.fund(XRP(10000), alice, bob);
 
  138        env(trust(alice, bob[
"USD"](600)));
 
  139        env(trust(bob, alice[
"USD"](700)));
 
  142        env(pay(alice, bob, alice[
"USD"](24)));
 
  143        env.require(balance(bob, alice[
"USD"](24)));
 
  146        env(pay(alice, bob, bob[
"USD"](33)));
 
  147        env.require(balance(bob, alice[
"USD"](57)));
 
  150        env(pay(bob, alice, bob[
"USD"](90)));
 
  151        env.require(balance(bob, alice[
"USD"](-33)));
 
  154        env(pay(alice, bob, bob[
"USD"](733)));
 
  155        env.require(balance(bob, alice[
"USD"](700)));
 
  158        env(pay(bob, alice, bob[
"USD"](1300)));
 
  159        env.require(balance(bob, alice[
"USD"](-600)));
 
  162        env(pay(bob, alice, bob[
"USD"](1)), ter(
tecPATH_DRY));
 
  163        env.require(balance(bob, alice[
"USD"](-600)));
 
 
  171            (with_rate ? 
"With " : 
"Without ") + 
" Xfer Fee, " +
 
  172            (subscribe ? 
"With " : 
"Without ") + 
" Subscribe");
 
  173        using namespace test::jtx;
 
  175        Env env{*
this, features};
 
  177        Account gw{
"gateway"};
 
  178        Account alice{
"alice"};
 
  181        env.fund(XRP(10000), gw, alice, bob);
 
  184        env(trust(alice, gw[
"AUD"](100)));
 
  185        env(trust(bob, gw[
"AUD"](100)));
 
  187        env(pay(gw, alice, alice[
"AUD"](1)));
 
  190        env.require(balance(alice, gw[
"AUD"](1)));
 
  193        env(pay(alice, bob, gw[
"AUD"](1)));
 
  196        env.require(balance(alice, gw[
"AUD"](0)));
 
  197        env.require(balance(bob, gw[
"AUD"](1)));
 
  198        env.require(balance(gw, bob[
"AUD"](-1)));
 
  206            env(pay(bob, alice, gw[
"AUD"](0.5)), sendmax(gw[
"AUD"](0.55)));
 
  211            env(pay(bob, alice, gw[
"AUD"](0.5)));
 
  214        env.require(balance(alice, gw[
"AUD"](0.5)));
 
  215        env.require(balance(bob, gw[
"AUD"](with_rate ? 0.45 : 0.5)));
 
  216        env.require(balance(gw, bob[
"AUD"](with_rate ? -0.45 : -0.5)));
 
  222            jvs[jss::accounts].
append(gw.human());
 
  224            jvs[jss::streams].
append(
"transactions");
 
  225            jvs[jss::streams].
append(
"ledger");
 
  226            auto jv = wsc->invoke(
"subscribe", jvs);
 
  227            BEAST_EXPECT(jv[jss::status] == 
"success");
 
  231            using namespace std::chrono_literals;
 
  232            BEAST_EXPECT(wsc->findMsg(5s, [](
auto const& jval) {
 
  233                auto const& t = jval[jss::transaction];
 
  234                return t[jss::TransactionType] == jss::Payment;
 
  236            BEAST_EXPECT(wsc->findMsg(5s, [](
auto const& jval) {
 
  237                return jval[jss::type] == 
"ledgerClosed";
 
  241                wsc->invoke(
"unsubscribe", jv)[jss::status] == 
"success");
 
 
  248        testcase(
"Payments With Paths and Fees");
 
  249        using namespace test::jtx;
 
  251        Env env{*
this, features};
 
  252        Account gw{
"gateway"};
 
  253        Account alice{
"alice"};
 
  256        env.fund(XRP(10000), gw, alice, bob);
 
  262        env(trust(alice, gw[
"AUD"](100)));
 
  263        env(trust(bob, gw[
"AUD"](100)));
 
  265        env(pay(gw, alice, alice[
"AUD"](4.4)));
 
  266        env.require(balance(alice, gw[
"AUD"](4.4)));
 
  270        env(pay(alice, bob, gw[
"AUD"](1)), sendmax(gw[
"AUD"](1.1)));
 
  271        env.require(balance(alice, gw[
"AUD"](3.3)));
 
  272        env.require(balance(bob, gw[
"AUD"](1)));
 
  275        env(pay(alice, bob, bob[
"AUD"](1)), sendmax(gw[
"AUD"](1.1)));
 
  276        env.require(balance(alice, gw[
"AUD"](2.2)));
 
  277        env.require(balance(bob, gw[
"AUD"](2)));
 
  280        env(pay(alice, bob, gw[
"AUD"](1)), sendmax(alice[
"AUD"](1.1)));
 
  281        env.require(balance(alice, gw[
"AUD"](1.1)));
 
  282        env.require(balance(bob, gw[
"AUD"](3)));
 
  286        env(pay(alice, bob, bob[
"AUD"](1)),
 
  287            sendmax(alice[
"AUD"](1.1)),
 
  290        env.require(balance(alice, gw[
"AUD"](1.1)));
 
  291        env.require(balance(bob, gw[
"AUD"](3)));
 
 
  298        using namespace test::jtx;
 
  300        Env env{*
this, features};
 
  301        Account gw{
"gateway"};
 
  302        Account alice{
"alice"};
 
  305        env.fund(XRP(10000), gw, alice, bob);
 
  308        env(trust(alice, gw[
"USD"](600)));
 
  309        env(trust(bob, gw[
"USD"](700)));
 
  311        env(pay(gw, alice, alice[
"USD"](70)));
 
  312        env(pay(gw, bob, bob[
"USD"](50)));
 
  314        env.require(balance(alice, gw[
"USD"](70)));
 
  315        env.require(balance(bob, gw[
"USD"](50)));
 
  325        env.require(balance(alice, gw[
"USD"](70)));
 
  326        env.require(balance(bob, gw[
"USD"](50)));
 
  331        env.require(balance(alice, gw[
"USD"](65)));
 
  332        env.require(balance(bob, gw[
"USD"](55)));
 
 
  340            (with_rate ? 
"With " : 
"Without ") + 
" Xfer Fee, ");
 
  341        using namespace test::jtx;
 
  343        Env env{*
this, features};
 
  344        Account gw{
"gateway"};
 
  345        Account amazon{
"amazon"};
 
  346        Account alice{
"alice"};
 
  348        Account carol{
"carol"};
 
  350        env.fund(XRP(10000), gw, amazon, alice, bob, carol);
 
  353        env(trust(amazon, gw[
"USD"](2000)));
 
  354        env(trust(bob, alice[
"USD"](600)));
 
  355        env(trust(bob, gw[
"USD"](1000)));
 
  356        env(trust(carol, alice[
"USD"](700)));
 
  357        env(trust(carol, gw[
"USD"](1000)));
 
  362        env(pay(gw, bob, bob[
"USD"](100)));
 
  363        env(pay(gw, carol, carol[
"USD"](100)));
 
  368            env(pay(alice, amazon, gw[
"USD"](150)),
 
  369                sendmax(alice[
"USD"](200)),
 
  373            env(pay(alice, amazon, gw[
"USD"](150)),
 
  382                    carol[
"USD"].issue(),
 
  387            env.require(balance(carol, gw[
"USD"](35)));
 
  391            env.require(balance(alice, carol[
"USD"](-50)));
 
  392            env.require(balance(carol, gw[
"USD"](50)));
 
  394        env.require(balance(alice, bob[
"USD"](-100)));
 
  395        env.require(balance(amazon, gw[
"USD"](150)));
 
  396        env.require(balance(bob, gw[
"USD"](0)));
 
 
  402        testcase(
"Set Invoice ID on Payment");
 
  403        using namespace test::jtx;
 
  405        Env env{*
this, features};
 
  406        Account alice{
"alice"};
 
  409        env.fund(XRP(10000), alice);
 
  414        jvs[jss::accounts].
append(env.master.human());
 
  416        jvs[jss::streams].
append(
"transactions");
 
  417        BEAST_EXPECT(wsc->invoke(
"subscribe", jvs)[jss::status] == 
"success");
 
  419        char const* invoiceid =
 
  420            "243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89";
 
  424            pay(env.master, alice, XRP(10000)),
 
  425            json(sfInvoiceID.fieldName, invoiceid));
 
  426        jv[jss::tx_blob] = 
strHex(tx.stx->getSerializer().slice());
 
  427        auto jrr = wsc->invoke(
"submit", jv)[jss::result];
 
  428        BEAST_EXPECT(jrr[jss::status] == 
"success");
 
  429        BEAST_EXPECT(jrr[jss::tx_json][sfInvoiceID.fieldName] == invoiceid);
 
  432        using namespace std::chrono_literals;
 
  433        BEAST_EXPECT(wsc->findMsg(2s, [invoiceid](
auto const& jval) {
 
  434            auto const& t = jval[jss::transaction];
 
  435            return t[jss::TransactionType] == jss::Payment &&
 
  436                t[sfInvoiceID.fieldName] == invoiceid;
 
  439        BEAST_EXPECT(wsc->invoke(
"unsubscribe", jv)[jss::status] == 
"success");