23        testcase(
"Discrepancy test : XRP Discrepancy");
 
   24        using namespace test::jtx;
 
   25        Env env{*
this, features};
 
   35        env.fund(XRP(2000), A1);
 
   36        env.fund(XRP(1000), A2, A6, A7);
 
   37        env.fund(XRP(5000), A3);
 
   38        env.fund(XRP(1000000), A4);
 
   39        env.fund(XRP(600000), A5);
 
   42        env(trust(A1, A3[
"CNY"](200000)));
 
   43        env(pay(A3, A1, A3[
"CNY"](31)));
 
   46        env(trust(A1, A2[
"JPY"](1000000)));
 
   47        env(pay(A2, A1, A2[
"JPY"](729117)));
 
   50        env(trust(A4, A2[
"JPY"](10000000)));
 
   51        env(pay(A2, A4, A2[
"JPY"](470056)));
 
   54        env(trust(A5, A3[
"CNY"](50000)));
 
   55        env(pay(A3, A5, A3[
"CNY"](8683)));
 
   58        env(trust(A6, A3[
"CNY"](3000)));
 
   59        env(pay(A3, A6, A3[
"CNY"](293)));
 
   62        env(trust(A7, A6[
"CNY"](50000)));
 
   63        env(pay(A6, A7, A6[
"CNY"](261)));
 
   66        env(offer(A4, XRP(49147), A2[
"JPY"](34501)));
 
   67        env(offer(A5, A3[
"CNY"](3150), XRP(80086)));
 
   68        env(offer(A7, XRP(1233), A6[
"CNY"](25)));
 
   76        env(pay(A1, A1, A2[
"JPY"](1000)),
 
   77            json(payPaths.json()),
 
   79            sendmax(A3[
"CNY"](56)));
 
   83        jrq2[jss::binary] = 
false;
 
   84        jrq2[jss::transaction] =
 
   87        auto jrr = env.rpc(
"json", 
"tx", 
to_string(jrq2))[jss::result];
 
   88        uint64_t fee{jrr[jss::Fee].
asUInt()};
 
   89        auto meta = jrr[jss::meta];
 
   92        BEAST_EXPECT(meta[sfAffectedNodes.fieldName].size() == 9);
 
   93        for (
auto const& an : meta[sfAffectedNodes.fieldName])
 
   96            if (an.isMember(sfCreatedNode.fieldName))
 
   97                node = an[sfCreatedNode.fieldName];
 
   98            else if (an.isMember(sfModifiedNode.fieldName))
 
   99                node = an[sfModifiedNode.fieldName];
 
  100            else if (an.isMember(sfDeletedNode.fieldName))
 
  101                node = an[sfDeletedNode.fieldName];
 
  103            if (node && node[sfLedgerEntryType.fieldName] == jss::AccountRoot)
 
  106                    node.
isMember(sfPreviousFields.fieldName)
 
  107                    ? node[sfPreviousFields.fieldName]
 
  108                    : node[sfNewFields.fieldName];
 
  110                    ? node[sfFinalFields.fieldName]
 
  111                    : node[sfNewFields.fieldName];
 
  113                    sumPrev += beast::lexicalCastThrow<std::uint64_t>(
 
  114                        prevFields[sfBalance.fieldName].
asString());
 
  116                    sumFinal += beast::lexicalCastThrow<std::uint64_t>(
 
  117                        finalFields[sfBalance.fieldName].
asString());
 
  122        BEAST_EXPECT(sumPrev - sumFinal == fee);