23 testcase(
"Discrepancy test : XRP Discrepancy");
24 using namespace test::jtx;
25 Env env{*
this, features};
27 Account
const A1{
"A1"};
28 Account
const A2{
"A2"};
29 Account
const A3{
"A3"};
30 Account
const A4{
"A4"};
31 Account
const A5{
"A5"};
32 Account
const A6{
"A6"};
33 Account
const A7{
"A7"};
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()),
78 txflags(tfPartialPayment),
79 sendmax(A3[
"CNY"](56)));
83 jrq2[jss::binary] =
false;
86 auto jrr = env.rpc(
"json",
"tx",
to_string(jrq2))[jss::result];
87 uint64_t
const fee{jrr[jss::Fee].
asUInt()};
88 auto meta = jrr[jss::meta];
91 BEAST_EXPECT(meta[sfAffectedNodes.fieldName].size() == 9);
92 for (
auto const& an : meta[sfAffectedNodes.fieldName])
95 if (an.isMember(sfCreatedNode.fieldName))
97 node = an[sfCreatedNode.fieldName];
99 else if (an.isMember(sfModifiedNode.fieldName))
101 node = an[sfModifiedNode.fieldName];
103 else if (an.isMember(sfDeletedNode.fieldName))
105 node = an[sfDeletedNode.fieldName];
108 if (node && node[sfLedgerEntryType.fieldName] == jss::AccountRoot)
111 ? node[sfPreviousFields.fieldName]
112 : node[sfNewFields.fieldName];
114 ? node[sfFinalFields.fieldName]
115 : node[sfNewFields.fieldName];
118 sumPrev += beast::lexicalCastThrow<std::uint64_t>(
119 prevFields[sfBalance.fieldName].
asString());
123 sumFinal += beast::lexicalCastThrow<std::uint64_t>(
124 finalFields[sfBalance.fieldName].
asString());
130 BEAST_EXPECT(sumPrev - sumFinal == fee);