963 {{
"minimum_txn_in_ledger_standalone",
"3"}}, {{
"account_reserve",
"200"}, {
"owner_reserve",
"50"}}));
967 auto charlie =
Account(
"charlie");
975 auto const initQueueMax =
initFee(env, 3, 2, 10, 200, 50);
983 env(
noop(alice),
fee(11), queued);
986 auto aliceSeq = env.
seq(alice);
987 auto bobSeq = env.
seq(bob);
988 auto charlieSeq = env.
seq(charlie);
995 env(
noop(alice),
seq(aliceSeq + 1),
fee(13), queued);
999 env(
noop(alice),
seq(aliceSeq + 2),
fee(17), queued);
1003 env(
noop(bob), queued);
1007 env(
noop(bob),
seq(bobSeq + 1),
fee(50), queued);
1012 env(
noop(charlie),
fee(15), queued);
1015 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
1016 BEAST_EXPECT(env.
seq(bob) == bobSeq);
1017 BEAST_EXPECT(env.
seq(charlie) == charlieSeq);
1027 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 3);
1028 BEAST_EXPECT(env.
seq(bob) == bobSeq + 1);
1029 BEAST_EXPECT(env.
seq(charlie) == charlieSeq + 1);
1033 aliceSeq = env.
seq(alice);
1034 auto lastLedgerSeq = env.
current()->header().seq + 2;
1035 for (
auto i = 0; i < 7; i++)
1037 env(
noop(alice),
seq(aliceSeq),
json(jss::LastLedgerSequence, lastLedgerSeq + i),
fee(--aliceFee), queued);
1045 auto const& baseFee = env.
current()->fees().base;
1046 auto seq = env.
seq(alice);
1047 BEAST_EXPECT(aliceStat.size() == 7);
1048 for (
auto const& tx : aliceStat)
1050 BEAST_EXPECT(tx.seqProxy.isSeq() && tx.seqProxy.value() ==
seq);
1052 BEAST_EXPECT(tx.lastValid);
1054 (tx.consequences.fee() ==
drops(aliceFee) && tx.consequences.potentialSpend() ==
drops(0) &&
1055 !tx.consequences.isBlocker()) ||
1056 tx.seqProxy.value() == env.
seq(alice) + 6);
1066 json(jss::LastLedgerSequence, lastLedgerSeq + 7),
1079 env(
noop(charlie),
fee(30), queued);
1096 aliceSeq = env.
seq(alice) + 2;
1103 env(
noop(alice),
seq(aliceSeq),
fee(aliceFee), queued);
1112 aliceSeq = env.
seq(alice) + 1;
1118 aliceFee = env.
le(alice)->getFieldAmount(sfBalance).xrp().drops() - (62);
1130 env(
noop(alice),
seq(aliceSeq),
fee(aliceFee), queued);
1155 bobSeq = env.
seq(bob);
1157 for (
int i = 0; i < 10; ++i)
1158 env(
noop(bob),
seq(bobSeq + i), queued);
1165 env(
noop(bob),
seq(bobSeq + 5),
fee(20), queued);
1171 std::int64_t bobFee = env.
le(bob)->getFieldAmount(sfBalance).xrp().drops() - (9 * 10 - 1);
1181 bobFee = env.
le(bob)->getFieldAmount(sfBalance).xrp().drops() - (9 * 10);
1197 using namespace jtx;
1201 auto cfg =
makeConfig({{
"minimum_txn_in_ledger_standalone",
"4"}});
1202 cfg->FEES.reference_fee = 10;
1203 Env env(*
this, std::move(cfg));
1205 auto alice =
Account(
"alice");
1207 auto charlie =
Account(
"charlie");
1208 auto daria =
Account(
"daria");
1216 BEAST_EXPECT(env.
current()->fees().base == 10);
1244 auto aliceSeq = env.
seq(alice);
1245 auto bobSeq = env.
seq(bob);
1246 auto charlieSeq = env.
seq(charlie);
1247 auto dariaSeq = env.
seq(daria);
1248 auto elmoSeq = env.
seq(elmo);
1249 auto fredSeq = env.
seq(fred);
1250 auto gwenSeq = env.
seq(gwen);
1251 auto hankSeq = env.
seq(hank);
1257 env(
noop(alice),
fee(15), queued);
1258 env(
noop(bob),
fee(15), queued);
1259 env(
noop(charlie),
fee(15), queued);
1260 env(
noop(daria),
fee(15), queued);
1261 env(
noop(elmo),
fee(15), queued);
1262 env(
noop(fred),
fee(15), queued);
1263 env(
noop(gwen),
fee(15), queued);
1264 env(
noop(hank),
fee(15), queued);
1279 env(
noop(charlie),
fee(100),
seq(charlieSeq + 1), queued);
1293 aliceSeq + bobSeq + charlieSeq + dariaSeq + elmoSeq + fredSeq + gwenSeq + hankSeq + 6 ==
1294 env.
seq(alice) + env.
seq(bob) + env.
seq(charlie) + env.
seq(daria) + env.
seq(elmo) + env.
seq(fred) +
1295 env.
seq(gwen) + env.
seq(hank));
1297 using namespace std::string_literals;
1303 charlieSeq + 2 == env.
seq(charlie),
1306 dariaSeq + 1 == env.
seq(daria),
1328 auto getTxsQueued = [&]() {
1331 for (
auto const& tx : txs)
1333 ++result[tx.txn->at(sfAccount)];
1337 auto qTxCount1 = getTxsQueued();
1338 BEAST_EXPECT(qTxCount1.size() <= 3);
1341 env(
noop(alice),
seq(aliceSeq + qTxCount1[alice.id()]++),
fee(15), queued);
1342 env(
noop(bob),
seq(bobSeq + qTxCount1[bob.id()]++),
fee(15), queued);
1343 env(
noop(charlie),
seq(charlieSeq + qTxCount1[charlie.id()]++),
fee(15), queued);
1344 env(
noop(daria),
seq(dariaSeq + qTxCount1[daria.id()]++),
fee(15), queued);
1345 env(
noop(elmo),
seq(elmoSeq + qTxCount1[elmo.id()]++),
fee(15), queued);
1346 env(
noop(fred),
seq(fredSeq + qTxCount1[fred.id()]++),
fee(15), queued);
1347 env(
noop(gwen),
seq(gwenSeq + qTxCount1[gwen.id()]++),
fee(15), queued);
1355 env(
noop(alice),
fee(100),
seq(aliceSeq + qTxCount1[alice.id()]++), queued);
1366 auto qTxCount2 = getTxsQueued();
1367 BEAST_EXPECT(qTxCount2.size() <= 4);
1372 aliceSeq + bobSeq + charlieSeq + dariaSeq + elmoSeq + fredSeq + gwenSeq + hankSeq + 7 ==
1373 env.
seq(alice) + env.
seq(bob) + env.
seq(charlie) + env.
seq(daria) + env.
seq(elmo) + env.
seq(fred) +
1374 env.
seq(gwen) + env.
seq(hank));
1377 aliceSeq + qTxCount1[alice.id()] - qTxCount2[alice.id()] == env.
seq(alice),
1380 bobSeq + qTxCount1[bob.id()] - qTxCount2[bob.id()] == env.
seq(bob),
1383 charlieSeq + qTxCount1[charlie.id()] - qTxCount2[charlie.id()] == env.
seq(charlie),
1386 dariaSeq + qTxCount1[daria.id()] - qTxCount2[daria.id()] == env.
seq(daria),
1389 elmoSeq + qTxCount1[elmo.id()] - qTxCount2[elmo.id()] == env.
seq(elmo),
1392 fredSeq + qTxCount1[fred.id()] - qTxCount2[fred.id()] == env.
seq(fred),
1395 gwenSeq + qTxCount1[gwen.id()] - qTxCount2[gwen.id()] == env.
seq(gwen),
1398 hankSeq + qTxCount1[hank.id()] - qTxCount2[hank.id()] == env.
seq(hank),
1902 using namespace jtx;
1903 testcase(
"In-flight balance checks");
1908 {{
"minimum_txn_in_ledger_standalone",
"3"}}, {{
"account_reserve",
"200"}, {
"owner_reserve",
"50"}}));
1910 auto alice =
Account(
"alice");
1911 auto charlie =
Account(
"charlie");
1922 auto const initQueueMax =
initFee(env, 3, 2, 10, 200, 50);
1929 checkMetrics(*
this, env, 0, initQueueMax, limit + 1, limit);
1931 auto USD = gw[
"USD"];
1932 auto BUX = gw[
"BUX"];
1936 auto aliceSeq = env.
seq(alice);
1937 auto aliceBal = env.
balance(alice);
1943 env(
offer(alice, BUX(5000),
XRP(50000)), queued);
1944 checkMetrics(*
this, env, 1, initQueueMax, limit + 1, limit);
1948 env(
noop(alice),
seq(aliceSeq + 1), queued);
1949 checkMetrics(*
this, env, 2, initQueueMax, limit + 1, limit);
1965 checkMetrics(*
this, env, 0, limit * 2, limit + 1, limit);
1966 aliceSeq = env.
seq(alice);
1967 aliceBal = env.
balance(alice);
1973 checkMetrics(*
this, env, 1, limit * 2, limit + 1, limit);
1978 checkMetrics(*
this, env, 2, limit * 2, limit + 1, limit);
1983 checkMetrics(*
this, env, 2, limit * 2, limit + 1, limit);
1999 checkMetrics(*
this, env, 0, limit * 2, limit + 1, limit);
2000 aliceSeq = env.
seq(alice);
2001 aliceBal = env.
balance(alice);
2008 checkMetrics(*
this, env, 1, limit * 2, limit + 1, limit);
2013 checkMetrics(*
this, env, 1, limit * 2, limit + 1, limit);
2029 checkMetrics(*
this, env, 0, limit * 2, limit + 1, limit);
2030 aliceSeq = env.
seq(alice);
2031 aliceBal = env.
balance(alice);
2035 env(
offer(alice, BUX(50),
XRP(500)), queued);
2038 env(
noop(alice),
seq(aliceSeq + 1), queued);
2039 checkMetrics(*
this, env, 2, limit * 2, limit + 1, limit);
2055 checkMetrics(*
this, env, 0, limit * 2, limit + 1, limit);
2057 aliceSeq = env.
seq(alice);
2058 aliceBal = env.
balance(alice);
2063 env(
pay(alice, charlie,
XRP(50000)), queued);
2067 env(
noop(alice),
seq(aliceSeq + 1), queued);
2068 checkMetrics(*
this, env, 2, limit * 2, limit + 1, limit);
2082 checkMetrics(*
this, env, 0, limit * 2, limit + 1, limit);
2084 aliceSeq = env.
seq(alice);
2085 aliceBal = env.
balance(alice);
2089 env(
pay(alice, charlie,
XRP(500)), queued);
2092 env(
noop(alice),
seq(aliceSeq + 1), queued);
2093 checkMetrics(*
this, env, 2, limit * 2, limit + 1, limit);
2104 auto const amount = USD(500000);
2105 env(
trust(alice, USD(50000000)));
2106 env(
trust(charlie, USD(50000000)));
2119 checkMetrics(*
this, env, 0, limit * 2, limit + 1, limit);
2121 aliceSeq = env.
seq(alice);
2122 aliceBal = env.
balance(alice);
2123 auto aliceUSD = env.
balance(alice, USD);
2127 env(
pay(alice, charlie,
amount), queued);
2131 env(
noop(alice),
seq(aliceSeq + 1), queued);
2132 checkMetrics(*
this, env, 2, limit * 2, limit + 1, limit);
2150 env(
offer(gw,
XRP(500000), USD(50000)));
2156 checkMetrics(*
this, env, 0, limit * 2, limit + 1, limit);
2158 aliceSeq = env.
seq(alice);
2159 aliceBal = env.
balance(alice);
2160 auto charlieUSD = env.
balance(charlie, USD);
2166 BEAST_EXPECT(
XRP(60000) > aliceBal);
2167 env(
pay(alice, charlie, USD(1000)),
sendmax(
XRP(60000)), queued);
2171 env(
noop(alice),
seq(aliceSeq + 1), queued);
2172 checkMetrics(*
this, env, 2, limit * 2, limit + 1, limit);
2183 balance(charlie, charlieUSD + USD(1000)),
2191 checkMetrics(*
this, env, 0, limit * 2, limit + 1, limit);
2193 aliceSeq = env.
seq(alice);
2194 aliceBal = env.
balance(alice);
2195 charlieUSD = env.
balance(charlie, USD);
2201 BEAST_EXPECT(aliceBal >
XRP(6001));
2202 env(
pay(alice, charlie, USD(500)),
sendmax(
XRP(6000)), queued);
2205 env(
noop(alice),
seq(aliceSeq + 1), queued);
2206 checkMetrics(*
this, env, 2, limit * 2, limit + 1, limit);
2217 balance(charlie, charlieUSD + USD(500)),
2227 checkMetrics(*
this, env, 0, limit * 2, limit + 1, limit);
2229 aliceSeq = env.
seq(alice);
2230 aliceBal = env.
balance(alice);
2231 BEAST_EXPECT(aliceBal ==
drops(30));
2237 checkMetrics(*
this, env, 1, limit * 2, limit + 1, limit);
2395 using namespace jtx;
2400 auto fee = env.
rpc(
"fee");
2404 auto const& result =
fee[jss::result];
2405 BEAST_EXPECT(result.isMember(jss::ledger_current_index) && result[jss::ledger_current_index] == 3);
2406 BEAST_EXPECT(result.isMember(jss::current_ledger_size));
2407 BEAST_EXPECT(result.isMember(jss::current_queue_size));
2408 BEAST_EXPECT(result.isMember(jss::expected_ledger_size));
2409 BEAST_EXPECT(!result.isMember(jss::max_queue_size));
2410 BEAST_EXPECT(result.isMember(jss::drops));
2411 auto const&
drops = result[jss::drops];
2412 BEAST_EXPECT(
drops.isMember(jss::base_fee));
2413 BEAST_EXPECT(
drops.isMember(jss::median_fee));
2414 BEAST_EXPECT(
drops.isMember(jss::minimum_fee));
2415 BEAST_EXPECT(
drops.isMember(jss::open_ledger_fee));
2416 BEAST_EXPECT(result.isMember(jss::levels));
2417 auto const& levels = result[jss::levels];
2418 BEAST_EXPECT(levels.isMember(jss::median_level));
2419 BEAST_EXPECT(levels.isMember(jss::minimum_level));
2420 BEAST_EXPECT(levels.isMember(jss::open_ledger_level));
2421 BEAST_EXPECT(levels.isMember(jss::reference_level));
2430 auto const& result =
fee[jss::result];
2431 BEAST_EXPECT(result.isMember(jss::ledger_current_index) && result[jss::ledger_current_index] == 4);
2432 BEAST_EXPECT(result.isMember(jss::current_ledger_size));
2433 BEAST_EXPECT(result.isMember(jss::current_queue_size));
2434 BEAST_EXPECT(result.isMember(jss::expected_ledger_size));
2435 BEAST_EXPECT(result.isMember(jss::max_queue_size));
2436 auto const&
drops = result[jss::drops];
2437 BEAST_EXPECT(
drops.isMember(jss::base_fee));
2438 BEAST_EXPECT(
drops.isMember(jss::median_fee));
2439 BEAST_EXPECT(
drops.isMember(jss::minimum_fee));
2440 BEAST_EXPECT(
drops.isMember(jss::open_ledger_fee));
2441 BEAST_EXPECT(result.isMember(jss::levels));
2442 auto const& levels = result[jss::levels];
2443 BEAST_EXPECT(levels.isMember(jss::median_level));
2444 BEAST_EXPECT(levels.isMember(jss::minimum_level));
2445 BEAST_EXPECT(levels.isMember(jss::open_ledger_level));
2446 BEAST_EXPECT(levels.isMember(jss::reference_level));
2804 using namespace jtx;
2807 Env env(*
this,
makeConfig({{
"minimum_txn_in_ledger_standalone",
"3"}}));
2808 auto const baseFee = env.
current()->fees().base.drops();
2812 env.
fund(
XRP(1000000), alice);
2816 withQueue[jss::account] = alice.human();
2817 withQueue[jss::queue] =
true;
2820 withoutQueue[jss::account] = alice.human();
2823 prevLedgerWithQueue[jss::account] = alice.human();
2824 prevLedgerWithQueue[jss::queue] =
true;
2825 prevLedgerWithQueue[jss::ledger_index] = 3;
2826 BEAST_EXPECT(env.
current()->header().seq > 3);
2830 auto const info = env.
rpc(
"json",
"account_info",
to_string(withoutQueue));
2831 BEAST_EXPECT(info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
2832 BEAST_EXPECT(!info[jss::result].isMember(jss::queue_data));
2836 auto const info = env.
rpc(
"json",
"account_info",
to_string(withQueue));
2837 BEAST_EXPECT(info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
2838 auto const& result = info[jss::result];
2839 BEAST_EXPECT(result.isMember(jss::queue_data));
2840 auto const& queue_data = result[jss::queue_data];
2841 BEAST_EXPECT(queue_data.isObject());
2842 BEAST_EXPECT(queue_data.isMember(jss::txn_count));
2843 BEAST_EXPECT(queue_data[jss::txn_count] == 0);
2844 BEAST_EXPECT(!queue_data.isMember(jss::lowest_sequence));
2845 BEAST_EXPECT(!queue_data.isMember(jss::highest_sequence));
2846 BEAST_EXPECT(!queue_data.isMember(jss::auth_change_queued));
2847 BEAST_EXPECT(!queue_data.isMember(jss::max_spend_drops_total));
2848 BEAST_EXPECT(!queue_data.isMember(jss::transactions));
2856 auto const info = env.
rpc(
"json",
"account_info",
to_string(withQueue));
2857 BEAST_EXPECT(info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
2858 auto const& result = info[jss::result];
2859 BEAST_EXPECT(result.isMember(jss::queue_data));
2860 auto const& queue_data = result[jss::queue_data];
2861 BEAST_EXPECT(queue_data.isObject());
2862 BEAST_EXPECT(queue_data.isMember(jss::txn_count));
2863 BEAST_EXPECT(queue_data[jss::txn_count] == 0);
2864 BEAST_EXPECT(!queue_data.isMember(jss::lowest_sequence));
2865 BEAST_EXPECT(!queue_data.isMember(jss::highest_sequence));
2866 BEAST_EXPECT(!queue_data.isMember(jss::auth_change_queued));
2867 BEAST_EXPECT(!queue_data.isMember(jss::max_spend_drops_total));
2868 BEAST_EXPECT(!queue_data.isMember(jss::transactions));
2879 auto const info = env.
rpc(
"json",
"account_info",
to_string(withQueue));
2880 BEAST_EXPECT(info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
2881 auto const& result = info[jss::result];
2882 auto const&
data = result[jss::account_data];
2883 BEAST_EXPECT(result.isMember(jss::queue_data));
2884 auto const& queue_data = result[jss::queue_data];
2885 BEAST_EXPECT(queue_data.isObject());
2886 BEAST_EXPECT(queue_data.isMember(jss::txn_count));
2887 BEAST_EXPECT(queue_data[jss::txn_count] == 4);
2888 BEAST_EXPECT(queue_data.isMember(jss::lowest_sequence));
2889 BEAST_EXPECT(queue_data[jss::lowest_sequence] ==
data[jss::Sequence]);
2890 BEAST_EXPECT(queue_data.isMember(jss::highest_sequence));
2892 queue_data[jss::highest_sequence] ==
2893 data[jss::Sequence].asUInt() + queue_data[jss::txn_count].asUInt() - 1);
2894 BEAST_EXPECT(queue_data.isMember(jss::auth_change_queued));
2895 BEAST_EXPECT(queue_data[jss::auth_change_queued] ==
false);
2896 BEAST_EXPECT(queue_data.isMember(jss::max_spend_drops_total));
2897 BEAST_EXPECT(queue_data[jss::max_spend_drops_total] ==
std::to_string(baseFee * 40));
2898 BEAST_EXPECT(queue_data.isMember(jss::transactions));
2899 auto const& queued = queue_data[jss::transactions];
2900 BEAST_EXPECT(queued.size() == queue_data[jss::txn_count]);
2901 for (
unsigned i = 0; i < queued.size(); ++i)
2903 auto const& item = queued[i];
2904 BEAST_EXPECT(item[jss::seq] ==
data[jss::Sequence].asInt() + i);
2906 BEAST_EXPECT(!item.isMember(jss::LastLedgerSequence));
2908 BEAST_EXPECT(item.isMember(jss::fee));
2910 BEAST_EXPECT(item.isMember(jss::max_spend_drops));
2911 BEAST_EXPECT(item[jss::max_spend_drops] ==
std::to_string(baseFee * 10));
2912 BEAST_EXPECT(item.isMember(jss::auth_change));
2913 BEAST_EXPECT(item[jss::auth_change].asBool() ==
false);
2928 json(jss::LastLedgerSequence, 10),
2933 auto const info = env.
rpc(
"json",
"account_info",
to_string(withQueue));
2934 BEAST_EXPECT(info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
2935 auto const& result = info[jss::result];
2936 auto const&
data = result[jss::account_data];
2937 BEAST_EXPECT(result.isMember(jss::queue_data));
2938 auto const& queue_data = result[jss::queue_data];
2939 BEAST_EXPECT(queue_data.isObject());
2940 BEAST_EXPECT(queue_data.isMember(jss::txn_count));
2941 BEAST_EXPECT(queue_data[jss::txn_count] == 1);
2942 BEAST_EXPECT(queue_data.isMember(jss::lowest_sequence));
2943 BEAST_EXPECT(queue_data[jss::lowest_sequence] ==
data[jss::Sequence]);
2944 BEAST_EXPECT(queue_data.isMember(jss::highest_sequence));
2946 queue_data[jss::highest_sequence] ==
2947 data[jss::Sequence].asUInt() + queue_data[jss::txn_count].asUInt() - 1);
2948 BEAST_EXPECT(queue_data.isMember(jss::auth_change_queued));
2949 BEAST_EXPECT(queue_data[jss::auth_change_queued] ==
true);
2950 BEAST_EXPECT(queue_data.isMember(jss::max_spend_drops_total));
2951 BEAST_EXPECT(queue_data[jss::max_spend_drops_total] ==
std::to_string(baseFee * 10));
2952 BEAST_EXPECT(queue_data.isMember(jss::transactions));
2953 auto const& queued = queue_data[jss::transactions];
2954 BEAST_EXPECT(queued.size() == queue_data[jss::txn_count]);
2955 for (
unsigned i = 0; i < queued.size(); ++i)
2957 auto const& item = queued[i];
2958 BEAST_EXPECT(item[jss::seq] ==
data[jss::Sequence].asInt() + i);
2960 BEAST_EXPECT(item.isMember(jss::fee));
2962 BEAST_EXPECT(item.isMember(jss::max_spend_drops));
2963 BEAST_EXPECT(item[jss::max_spend_drops] ==
std::to_string(baseFee * 10));
2964 BEAST_EXPECT(item.isMember(jss::auth_change));
2966 if (i == queued.size() - 1)
2968 BEAST_EXPECT(item[jss::auth_change].asBool() ==
true);
2969 BEAST_EXPECT(item.isMember(jss::LastLedgerSequence));
2970 BEAST_EXPECT(item[jss::LastLedgerSequence] == 10);
2974 BEAST_EXPECT(item[jss::auth_change].asBool() ==
false);
2975 BEAST_EXPECT(!item.isMember(jss::LastLedgerSequence));
2984 auto const info = env.
rpc(
"json",
"account_info",
to_string(withQueue));
2985 BEAST_EXPECT(info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
2986 auto const& result = info[jss::result];
2987 auto const&
data = result[jss::account_data];
2988 BEAST_EXPECT(result.isMember(jss::queue_data));
2989 auto const& queue_data = result[jss::queue_data];
2990 BEAST_EXPECT(queue_data.isObject());
2991 BEAST_EXPECT(queue_data.isMember(jss::txn_count));
2992 BEAST_EXPECT(queue_data[jss::txn_count] == 1);
2993 BEAST_EXPECT(queue_data.isMember(jss::lowest_sequence));
2994 BEAST_EXPECT(queue_data[jss::lowest_sequence] ==
data[jss::Sequence]);
2995 BEAST_EXPECT(queue_data.isMember(jss::highest_sequence));
2997 queue_data[jss::highest_sequence] ==
2998 data[jss::Sequence].asUInt() + queue_data[jss::txn_count].asUInt() - 1);
2999 BEAST_EXPECT(queue_data.isMember(jss::auth_change_queued));
3000 BEAST_EXPECT(queue_data[jss::auth_change_queued].asBool());
3001 BEAST_EXPECT(queue_data.isMember(jss::max_spend_drops_total));
3002 BEAST_EXPECT(queue_data[jss::max_spend_drops_total] ==
std::to_string(baseFee * 10));
3003 BEAST_EXPECT(queue_data.isMember(jss::transactions));
3004 auto const& queued = queue_data[jss::transactions];
3005 BEAST_EXPECT(queued.size() == queue_data[jss::txn_count]);
3006 for (
unsigned i = 0; i < queued.size(); ++i)
3008 auto const& item = queued[i];
3009 BEAST_EXPECT(item[jss::seq] ==
data[jss::Sequence].asInt() + i);
3012 if (i == queued.size() - 1)
3014 BEAST_EXPECT(item.isMember(jss::fee));
3016 BEAST_EXPECT(item.isMember(jss::max_spend_drops));
3017 BEAST_EXPECT(item[jss::max_spend_drops] ==
std::to_string(baseFee * 10));
3018 BEAST_EXPECT(item.isMember(jss::auth_change));
3019 BEAST_EXPECT(item[jss::auth_change].asBool());
3020 BEAST_EXPECT(item.isMember(jss::LastLedgerSequence));
3021 BEAST_EXPECT(item[jss::LastLedgerSequence] == 10);
3025 BEAST_EXPECT(item.isMember(jss::fee));
3027 BEAST_EXPECT(item.isMember(jss::max_spend_drops));
3028 BEAST_EXPECT(item[jss::max_spend_drops] ==
std::to_string(baseFee * 10));
3029 BEAST_EXPECT(item.isMember(jss::auth_change));
3030 BEAST_EXPECT(!item[jss::auth_change].asBool());
3031 BEAST_EXPECT(!item.isMember(jss::LastLedgerSequence));
3037 auto const info = env.
rpc(
"json",
"account_info",
to_string(prevLedgerWithQueue));
3047 auto const info = env.
rpc(
"json",
"account_info",
to_string(withQueue));
3048 BEAST_EXPECT(info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
3049 auto const& result = info[jss::result];
3050 BEAST_EXPECT(result.isMember(jss::queue_data));
3051 auto const& queue_data = result[jss::queue_data];
3052 BEAST_EXPECT(queue_data.isObject());
3053 BEAST_EXPECT(queue_data.isMember(jss::txn_count));
3054 BEAST_EXPECT(queue_data[jss::txn_count] == 0);
3055 BEAST_EXPECT(!queue_data.isMember(jss::lowest_sequence));
3056 BEAST_EXPECT(!queue_data.isMember(jss::highest_sequence));
3057 BEAST_EXPECT(!queue_data.isMember(jss::auth_change_queued));
3058 BEAST_EXPECT(!queue_data.isMember(jss::max_spend_drops_total));
3059 BEAST_EXPECT(!queue_data.isMember(jss::transactions));
3066 using namespace jtx;
3069 Env env(*
this,
makeConfig({{
"minimum_txn_in_ledger_standalone",
"3"}}));
3070 auto const baseFee = env.
current()->fees().base.drops();
3074 env.
fund(
XRP(1000000), alice);
3078 auto const server_info = env.
rpc(
"server_info");
3079 BEAST_EXPECT(server_info.isMember(jss::result) && server_info[jss::result].isMember(jss::info));
3080 auto const& info = server_info[jss::result][jss::info];
3081 BEAST_EXPECT(info.isMember(jss::load_factor) && info[jss::load_factor] == 1);
3082 BEAST_EXPECT(!info.isMember(jss::load_factor_server));
3083 BEAST_EXPECT(!info.isMember(jss::load_factor_local));
3084 BEAST_EXPECT(!info.isMember(jss::load_factor_net));
3085 BEAST_EXPECT(!info.isMember(jss::load_factor_fee_escalation));
3088 auto const server_state = env.
rpc(
"server_state");
3089 auto const& state = server_state[jss::result][jss::state];
3090 BEAST_EXPECT(state.isMember(jss::load_factor) && state[jss::load_factor] == 256);
3091 BEAST_EXPECT(state.isMember(jss::load_base) && state[jss::load_base] == 256);
3092 BEAST_EXPECT(state.isMember(jss::load_factor_server) && state[jss::load_factor_server] == 256);
3094 state.isMember(jss::load_factor_fee_escalation) && state[jss::load_factor_fee_escalation] == 256);
3095 BEAST_EXPECT(state.isMember(jss::load_factor_fee_queue) && state[jss::load_factor_fee_queue] == 256);
3097 state.isMember(jss::load_factor_fee_reference) && state[jss::load_factor_fee_reference] == 256);
3105 auto aliceSeq = env.
seq(alice);
3107 for (
auto i = 0; i < 4; ++i)
3112 auto const server_info = env.
rpc(
"server_info");
3113 BEAST_EXPECT(server_info.isMember(jss::result) && server_info[jss::result].isMember(jss::info));
3114 auto const& info = server_info[jss::result][jss::info];
3117 info.isMember(jss::load_factor) && info[jss::load_factor] > 888.88 && info[jss::load_factor] < 888.89);
3118 BEAST_EXPECT(info.isMember(jss::load_factor_server) && info[jss::load_factor_server] == 1);
3119 BEAST_EXPECT(!info.isMember(jss::load_factor_local));
3120 BEAST_EXPECT(!info.isMember(jss::load_factor_net));
3122 info.isMember(jss::load_factor_fee_escalation) && info[jss::load_factor_fee_escalation] > 888.88 &&
3123 info[jss::load_factor_fee_escalation] < 888.89);
3126 auto const server_state = env.
rpc(
"server_state");
3127 auto const& state = server_state[jss::result][jss::state];
3128 BEAST_EXPECT(state.isMember(jss::load_factor) && state[jss::load_factor] == 227555);
3129 BEAST_EXPECT(state.isMember(jss::load_base) && state[jss::load_base] == 256);
3130 BEAST_EXPECT(state.isMember(jss::load_factor_server) && state[jss::load_factor_server] == 256);
3132 state.isMember(jss::load_factor_fee_escalation) && state[jss::load_factor_fee_escalation] == 227555);
3133 BEAST_EXPECT(state.isMember(jss::load_factor_fee_queue) && state[jss::load_factor_fee_queue] == 256);
3135 state.isMember(jss::load_factor_fee_reference) && state[jss::load_factor_fee_reference] == 256);
3141 auto const server_info = env.
rpc(
"server_info");
3142 BEAST_EXPECT(server_info.isMember(jss::result) && server_info[jss::result].isMember(jss::info));
3143 auto const& info = server_info[jss::result][jss::info];
3145 BEAST_EXPECT(info.isMember(jss::load_factor) && info[jss::load_factor] == 1000);
3146 BEAST_EXPECT(!info.isMember(jss::load_factor_server));
3147 BEAST_EXPECT(!info.isMember(jss::load_factor_local));
3148 BEAST_EXPECT(info.isMember(jss::load_factor_net) && info[jss::load_factor_net] == 1000);
3150 info.isMember(jss::load_factor_fee_escalation) && info[jss::load_factor_fee_escalation] > 888.88 &&
3151 info[jss::load_factor_fee_escalation] < 888.89);
3154 auto const server_state = env.
rpc(
"server_state");
3155 auto const& state = server_state[jss::result][jss::state];
3156 BEAST_EXPECT(state.isMember(jss::load_factor) && state[jss::load_factor] == 256000);
3157 BEAST_EXPECT(state.isMember(jss::load_base) && state[jss::load_base] == 256);
3158 BEAST_EXPECT(state.isMember(jss::load_factor_server) && state[jss::load_factor_server] == 256000);
3160 state.isMember(jss::load_factor_fee_escalation) && state[jss::load_factor_fee_escalation] == 227555);
3161 BEAST_EXPECT(state.isMember(jss::load_factor_fee_queue) && state[jss::load_factor_fee_queue] == 256);
3163 state.isMember(jss::load_factor_fee_reference) && state[jss::load_factor_fee_reference] == 256);
3169 for (
int i = 0; i < 5; ++i)
3174 auto const server_info = env.
rpc(
"server_info");
3175 BEAST_EXPECT(server_info.isMember(jss::result) && server_info[jss::result].isMember(jss::info));
3176 auto const& info = server_info[jss::result][jss::info];
3179 info.isMember(jss::load_factor) && info[jss::load_factor] > 888.88 && info[jss::load_factor] < 888.89);
3184 info.isMember(jss::load_factor_server) && info[jss::load_factor_server] > 1.245 &&
3185 info[jss::load_factor_server] < 2.4415);
3187 info.isMember(jss::load_factor_local) && info[jss::load_factor_local] > 1.245 &&
3188 info[jss::load_factor_local] < 2.4415);
3189 BEAST_EXPECT(!info.isMember(jss::load_factor_net));
3191 info.isMember(jss::load_factor_fee_escalation) && info[jss::load_factor_fee_escalation] > 888.88 &&
3192 info[jss::load_factor_fee_escalation] < 888.89);
3195 auto const server_state = env.
rpc(
"server_state");
3196 auto const& state = server_state[jss::result][jss::state];
3197 BEAST_EXPECT(state.isMember(jss::load_factor) && state[jss::load_factor] == 227555);
3198 BEAST_EXPECT(state.isMember(jss::load_base) && state[jss::load_base] == 256);
3203 state.isMember(jss::load_factor_server) && state[jss::load_factor_server] >= 320 &&
3204 state[jss::load_factor_server] <= 625);
3206 state.isMember(jss::load_factor_fee_escalation) && state[jss::load_factor_fee_escalation] == 227555);
3207 BEAST_EXPECT(state.isMember(jss::load_factor_fee_queue) && state[jss::load_factor_fee_queue] == 256);
3209 state.isMember(jss::load_factor_fee_reference) && state[jss::load_factor_fee_reference] == 256);
3215 auto const server_info = env.
rpc(
"server_info");
3216 BEAST_EXPECT(server_info.isMember(jss::result) && server_info[jss::result].isMember(jss::info));
3217 auto const& info = server_info[jss::result][jss::info];
3224 info.isMember(jss::load_factor) && info[jss::load_factor] > 1.245 && info[jss::load_factor] < 2.4415);
3225 BEAST_EXPECT(!info.isMember(jss::load_factor_server));
3227 info.isMember(jss::load_factor_local) && info[jss::load_factor_local] > 1.245 &&
3228 info[jss::load_factor_local] < 2.4415);
3229 BEAST_EXPECT(!info.isMember(jss::load_factor_net));
3230 BEAST_EXPECT(!info.isMember(jss::load_factor_fee_escalation));
3233 auto const server_state = env.
rpc(
"server_state");
3234 auto const& state = server_state[jss::result][jss::state];
3236 state.isMember(jss::load_factor) && state[jss::load_factor] >= 320 && state[jss::load_factor] <= 625);
3237 BEAST_EXPECT(state.isMember(jss::load_base) && state[jss::load_base] == 256);
3242 state.isMember(jss::load_factor_server) && state[jss::load_factor_server] >= 320 &&
3243 state[jss::load_factor_server] <= 625);
3245 state.isMember(jss::load_factor_fee_escalation) && state[jss::load_factor_fee_escalation] == 256);
3246 BEAST_EXPECT(state.isMember(jss::load_factor_fee_queue) && state[jss::load_factor_fee_queue] == 256);
3248 state.isMember(jss::load_factor_fee_reference) && state[jss::load_factor_fee_reference] == 256);
3255 using namespace jtx;
3258 Env env(*
this,
makeConfig({{
"minimum_txn_in_ledger_standalone",
"3"}}));
3259 auto const baseFee = env.
current()->fees().base.drops();
3263 stream[jss::streams].append(
"server");
3266 auto jv = wsc->invoke(
"subscribe", stream);
3267 BEAST_EXPECT(jv[jss::status] ==
"success");
3270 Account a{
"a"}, b{
"b"}, c{
"c"}, d{
"d"}, e{
"e"}, f{
"f"}, g{
"g"}, h{
"h"}, i{
"i"};
3277 using namespace std::chrono_literals;
3278 BEAST_EXPECT(wsc->findMsg(5s, [&](
auto const& jv) {
3279 return jv[jss::type] ==
"serverStatus" && jv.isMember(jss::load_factor) && jv[jss::load_factor] == 256 &&
3280 jv.isMember(jss::load_base) && jv[jss::load_base] == 256 && jv.isMember(jss::load_factor_server) &&
3281 jv[jss::load_factor_server] == 256 && jv.isMember(jss::load_factor_fee_escalation) &&
3282 jv[jss::load_factor_fee_escalation] == 256 && jv.isMember(jss::load_factor_fee_queue) &&
3283 jv[jss::load_factor_fee_queue] == 256 && jv.isMember(jss::load_factor_fee_reference) &&
3284 jv[jss::load_factor_fee_reference] == 256;
3287 BEAST_EXPECT(wsc->findMsg(5s, [&](
auto const& jv) {
3288 return jv[jss::type] ==
"serverStatus" && jv.isMember(jss::load_factor) && jv[jss::load_factor] == 227555 &&
3289 jv.isMember(jss::load_base) && jv[jss::load_base] == 256 && jv.isMember(jss::load_factor_server) &&
3290 jv[jss::load_factor_server] == 256 && jv.isMember(jss::load_factor_fee_escalation) &&
3291 jv[jss::load_factor_fee_escalation] == 227555 && jv.isMember(jss::load_factor_fee_queue) &&
3292 jv[jss::load_factor_fee_queue] == 256 && jv.isMember(jss::load_factor_fee_reference) &&
3293 jv[jss::load_factor_fee_reference] == 256;
3299 BEAST_EXPECT(wsc->findMsg(5s, [&](
auto const& jv) {
3300 return jv[jss::type] ==
"serverStatus" && jv.isMember(jss::load_factor) && jv[jss::load_factor] == 256 &&
3301 jv.isMember(jss::load_base) && jv[jss::load_base] == 256 && jv.isMember(jss::load_factor_server) &&
3302 jv[jss::load_factor_server] == 256 && jv.isMember(jss::load_factor_fee_escalation) &&
3303 jv[jss::load_factor_fee_escalation] == 256 && jv.isMember(jss::load_factor_fee_queue) &&
3304 jv[jss::load_factor_fee_queue] == 256 && jv.isMember(jss::load_factor_fee_reference) &&
3305 jv[jss::load_factor_fee_reference] == 256;
3315 env(
noop(a),
fee(baseFee), queued);
3316 env(
noop(b),
fee(baseFee), queued);
3317 env(
noop(c),
fee(baseFee), queued);
3318 env(
noop(d),
fee(baseFee), queued);
3319 env(
noop(e),
fee(baseFee), queued);
3320 env(
noop(f),
fee(baseFee), queued);
3321 env(
noop(g),
fee(baseFee), queued);
3325 BEAST_EXPECT(wsc->findMsg(5s, [&](
auto const& jv) {
3326 return jv[jss::type] ==
"serverStatus" && jv.isMember(jss::load_factor) && jv[jss::load_factor] == 200000 &&
3327 jv.isMember(jss::load_base) && jv[jss::load_base] == 256 && jv.isMember(jss::load_factor_server) &&
3328 jv[jss::load_factor_server] == 256 && jv.isMember(jss::load_factor_fee_escalation) &&
3329 jv[jss::load_factor_fee_escalation] == 200000 && jv.isMember(jss::load_factor_fee_queue) &&
3330 jv[jss::load_factor_fee_queue] == 256 && jv.isMember(jss::load_factor_fee_reference) &&
3331 jv[jss::load_factor_fee_reference] == 256;
3336 BEAST_EXPECT(wsc->findMsg(5s, [&](
auto const& jv) {
3337 return jv[jss::type] ==
"serverStatus" && jv.isMember(jss::load_factor) && jv[jss::load_factor] == 184320 &&
3338 jv.isMember(jss::load_base) && jv[jss::load_base] == 256 && jv.isMember(jss::load_factor_server) &&
3339 jv[jss::load_factor_server] == 256 && jv.isMember(jss::load_factor_fee_escalation) &&
3340 jv[jss::load_factor_fee_escalation] == 184320 && jv.isMember(jss::load_factor_fee_queue) &&
3341 jv[jss::load_factor_fee_queue] == 256 && jv.isMember(jss::load_factor_fee_reference) &&
3342 jv[jss::load_factor_fee_reference] == 256;
3347 BEAST_EXPECT(wsc->findMsg(5s, [&](
auto const& jv) {
3348 return jv[jss::type] ==
"serverStatus" && jv.isMember(jss::load_factor) && jv[jss::load_factor] == 256 &&
3349 jv.isMember(jss::load_base) && jv[jss::load_base] == 256 && jv.isMember(jss::load_factor_server) &&
3350 jv[jss::load_factor_server] == 256 && jv.isMember(jss::load_factor_fee_escalation) &&
3351 jv[jss::load_factor_fee_escalation] == 256 && jv.isMember(jss::load_factor_fee_queue) &&
3352 jv[jss::load_factor_fee_queue] == 256 && jv.isMember(jss::load_factor_fee_reference) &&
3353 jv[jss::load_factor_fee_reference] == 256;
3356 BEAST_EXPECT(!wsc->findMsg(1s, [&](
auto const& jv) { return jv[jss::type] ==
"serverStatus"; }));
3358 auto jv = wsc->invoke(
"unsubscribe", stream);
3359 BEAST_EXPECT(jv[jss::status] ==
"success");
3568 using namespace jtx;
3569 using namespace std::chrono_literals;
3576 {{
"minimum_txn_in_ledger_standalone",
"3"},
3577 {
"normal_consensus_increase_percent",
"25"},
3578 {
"slow_consensus_decrease_percent",
"50"},
3579 {
"target_txn_in_ledger",
"10"},
3580 {
"maximum_txn_per_account",
"200"}}));
3581 auto alice =
Account(
"alice");
3584 env.
fund(
XRP(50000000), alice);
3588 auto seqAlice = env.
seq(alice);
3590 for (
int i = 0; i < txCount; ++i)
3634 env.
close(env.
now() + 5s, 10000ms);
3639 env.
close(env.
now() + 5s, 10000ms);
3644 env.
close(env.
now() + 5s, 10000ms);
3651 env.
close(env.
now() + 5s, 10000ms);
3655 BEAST_EXPECT(!txCount);
3662 {{
"minimum_txn_in_ledger_standalone",
"3"},
3663 {
"normal_consensus_increase_percent",
"150"},
3664 {
"slow_consensus_decrease_percent",
"150"},
3665 {
"target_txn_in_ledger",
"10"},
3666 {
"maximum_txn_per_account",
"200"}}));
3667 auto alice =
Account(
"alice");
3670 env.
fund(
XRP(50000000), alice);
3674 auto seqAlice = env.
seq(alice);
3676 for (
int i = 0; i < txCount; ++i)
3695 env.
close(env.
now() + 5s, 10000ms);
3701 BEAST_EXPECT(!txCount);
3872 using namespace jtx;
3881 constexpr int ledgersInQueue = 30;
3883 {{
"minimum_txn_in_ledger_standalone",
"1"},
3885 {
"maximum_txn_per_account",
"10"}},
3886 {{
"account_reserve",
"1000"}, {
"owner_reserve",
"50"}});
3888 auto& votingSection = cfg->section(
"voting");
3889 votingSection.set(
"account_reserve",
std::to_string(cfg->FEES.reference_fee.drops() * 100));
3891 votingSection.set(
"reference_fee",
std::to_string(cfg->FEES.reference_fee.drops()));
3893 Env env(*
this, std::move(cfg));
3909 checkMetrics(*
this, env, 0, ledgersInQueue * metrics.txPerLedger, 0, 2);
3913 for (i = 0; i <= 257; ++i)
3920 checkMetrics(*
this, env, 0, ledgersInQueue * expectedPerLedger, 0, expectedPerLedger);
3925 using namespace std::chrono_literals;
3926 auto closeDuration = 80min;
3927 for (i = 0; i <= 255; ++i)
3929 env.
close(closeDuration);
3932 auto const baseFee = env.
current()->fees().base.drops();
3935 checkMetrics(*
this, env, 0, ledgersInQueue * expectedPerLedger, expectedPerLedger + 1, expectedPerLedger);
3938 auto seqAlice = env.
seq(alice);
3939 auto seqBob = env.
seq(bob);
3940 auto seqCarol = env.
seq(carol);
3941 auto seqDaria = env.
seq(daria);
3942 auto seqEllie = env.
seq(ellie);
3943 auto seqFiona = env.
seq(fiona);
3946 int txFee{
static_cast<int>(baseFee * 9)};
3947 auto prepareFee = [&](
uint64_t multiplier) {
return fee(txFee - multiplier * baseFee / 10); };
3950 for (
int i = 0; i < 10; ++i)
3961 *
this, env, expectedInQueue, ledgersInQueue * expectedPerLedger, expectedPerLedger + 1, expectedPerLedger);
3974 env.
close(closeDuration);
3975 auto expectedInLedger = expectedInQueue;
3976 expectedInQueue = (expectedInQueue > expectedPerLedger + 2 ? expectedInQueue - (expectedPerLedger + 2) : 0);
3977 expectedInLedger -= expectedInQueue;
3978 ++expectedPerLedger;
3980 *
this, env, expectedInQueue, ledgersInQueue * expectedPerLedger, expectedInLedger, expectedPerLedger);
3982 auto const expectedPerAccount = expectedInQueue / 6;
3983 auto const expectedRemainder = expectedInQueue % 6;
3984 BEAST_EXPECT(env.
seq(alice) == seqAlice - expectedPerAccount);
3985 BEAST_EXPECT(env.
seq(bob) == seqBob - expectedPerAccount - (expectedRemainder > 4 ? 1 : 0));
3986 BEAST_EXPECT(env.
seq(carol) == seqCarol - expectedPerAccount - (expectedRemainder > 3 ? 1 : 0));
3987 BEAST_EXPECT(env.
seq(daria) == seqDaria - expectedPerAccount - (expectedRemainder > 2 ? 1 : 0));
3988 BEAST_EXPECT(env.
seq(ellie) == seqEllie - expectedPerAccount - (expectedRemainder > 1 ? 1 : 0));
3989 BEAST_EXPECT(env.
seq(fiona) == seqFiona - expectedPerAccount - (expectedRemainder > 0 ? 1 : 0));
3991 }
while (expectedInQueue > 0);
4320 using namespace jtx;
4328 {{
"minimum_txn_in_ledger_standalone",
"3"}},
4329 {{
"reference_fee",
"0"}, {
"account_reserve",
"0"}, {
"owner_reserve",
"0"}}));
4334 auto const initQueueMax =
initFee(env, 3, 2, 0, 0, 0);
4336 BEAST_EXPECT(env.
current()->fees().base == 0);
4339 auto const fee = env.
rpc(
"fee");
4343 auto const& result =
fee[jss::result];
4345 BEAST_EXPECT(result.isMember(jss::levels));
4346 auto const& levels = result[jss::levels];
4347 BEAST_EXPECT(levels.isMember(jss::median_level) && levels[jss::median_level] ==
"128000");
4348 BEAST_EXPECT(levels.isMember(jss::minimum_level) && levels[jss::minimum_level] ==
"256");
4349 BEAST_EXPECT(levels.isMember(jss::open_ledger_level) && levels[jss::open_ledger_level] ==
"256");
4350 BEAST_EXPECT(levels.isMember(jss::reference_level) && levels[jss::reference_level] ==
"256");
4352 auto const&
drops = result[jss::drops];
4353 BEAST_EXPECT(
drops.isMember(jss::base_fee) &&
drops[jss::base_fee] ==
"0");
4354 BEAST_EXPECT(
drops.isMember(jss::median_fee) &&
drops[jss::median_fee] ==
"0");
4355 BEAST_EXPECT(
drops.isMember(jss::minimum_fee) &&
drops[jss::minimum_fee] ==
"0");
4356 BEAST_EXPECT(
drops.isMember(jss::open_ledger_fee) &&
drops[jss::open_ledger_fee] ==
"0");
4380 auto aliceSeq = env.
seq(alice);
4381 env(
noop(alice), queued);
4385 env(
noop(alice),
seq(aliceSeq + 1),
fee(10), queued);
4390 auto const fee = env.
rpc(
"fee");
4394 auto const& result =
fee[jss::result];
4396 BEAST_EXPECT(result.isMember(jss::levels));
4397 auto const& levels = result[jss::levels];
4398 BEAST_EXPECT(levels.isMember(jss::median_level) && levels[jss::median_level] ==
"128000");
4399 BEAST_EXPECT(levels.isMember(jss::minimum_level) && levels[jss::minimum_level] ==
"256");
4400 BEAST_EXPECT(levels.isMember(jss::open_ledger_level) && levels[jss::open_ledger_level] ==
"355555");
4401 BEAST_EXPECT(levels.isMember(jss::reference_level) && levels[jss::reference_level] ==
"256");
4403 auto const&
drops = result[jss::drops];
4404 BEAST_EXPECT(
drops.isMember(jss::base_fee) &&
drops[jss::base_fee] ==
"0");
4405 BEAST_EXPECT(
drops.isMember(jss::median_fee) &&
drops[jss::median_fee] ==
"0");
4406 BEAST_EXPECT(
drops.isMember(jss::minimum_fee) &&
drops[jss::minimum_fee] ==
"0");
4407 BEAST_EXPECT(
drops.isMember(jss::open_ledger_fee) &&
drops[jss::open_ledger_fee] ==
"1389");