987 {{
"minimum_txn_in_ledger_standalone",
"3"}},
988 {{
"account_reserve",
"200"}, {
"owner_reserve",
"50"}}));
992 auto charlie =
Account(
"charlie");
1000 auto const initQueueMax =
initFee(env, 3, 2, 10, 200, 50);
1008 env(
noop(alice),
fee(11), queued);
1011 auto aliceSeq = env.
seq(alice);
1012 auto bobSeq = env.
seq(bob);
1013 auto charlieSeq = env.
seq(charlie);
1020 env(
noop(alice),
seq(aliceSeq + 1),
fee(13), queued);
1024 env(
noop(alice),
seq(aliceSeq + 2),
fee(17), queued);
1028 env(
noop(bob), queued);
1032 env(
noop(bob),
seq(bobSeq + 1),
fee(50), queued);
1037 env(
noop(charlie),
fee(15), queued);
1040 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
1041 BEAST_EXPECT(env.
seq(bob) == bobSeq);
1042 BEAST_EXPECT(env.
seq(charlie) == charlieSeq);
1052 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 3);
1053 BEAST_EXPECT(env.
seq(bob) == bobSeq + 1);
1054 BEAST_EXPECT(env.
seq(charlie) == charlieSeq + 1);
1058 aliceSeq = env.
seq(alice);
1059 auto lastLedgerSeq = env.
current()->header().seq + 2;
1060 for (
auto i = 0; i < 7; i++)
1064 json(jss::LastLedgerSequence, lastLedgerSeq + i),
1074 auto const& baseFee = env.
current()->fees().base;
1075 auto seq = env.
seq(alice);
1076 BEAST_EXPECT(aliceStat.size() == 7);
1077 for (
auto const& tx : aliceStat)
1079 BEAST_EXPECT(tx.seqProxy.isSeq() && tx.seqProxy.value() ==
seq);
1081 BEAST_EXPECT(tx.lastValid);
1083 (tx.consequences.fee() ==
drops(aliceFee) &&
1084 tx.consequences.potentialSpend() ==
drops(0) &&
1085 !tx.consequences.isBlocker()) ||
1086 tx.seqProxy.value() == env.
seq(alice) + 6);
1096 json(jss::LastLedgerSequence, lastLedgerSeq + 7),
1109 env(
noop(charlie),
fee(30), queued);
1126 aliceSeq = env.
seq(alice) + 2;
1133 env(
noop(alice),
seq(aliceSeq),
fee(aliceFee), queued);
1142 aliceSeq = env.
seq(alice) + 1;
1148 aliceFee = env.
le(alice)->getFieldAmount(sfBalance).xrp().drops() - (62);
1160 env(
noop(alice),
seq(aliceSeq),
fee(aliceFee), queued);
1185 bobSeq = env.
seq(bob);
1187 for (
int i = 0; i < 10; ++i)
1188 env(
noop(bob),
seq(bobSeq + i), queued);
1195 env(
noop(bob),
seq(bobSeq + 5),
fee(20), queued);
1201 std::int64_t bobFee = env.
le(bob)->getFieldAmount(sfBalance).xrp().drops() - (9 * 10 - 1);
1211 bobFee = env.
le(bob)->getFieldAmount(sfBalance).xrp().drops() - (9 * 10);
1227 using namespace jtx;
1231 auto cfg =
makeConfig({{
"minimum_txn_in_ledger_standalone",
"4"}});
1232 cfg->FEES.reference_fee = 10;
1233 Env env(*
this, std::move(cfg));
1235 auto alice =
Account(
"alice");
1237 auto charlie =
Account(
"charlie");
1238 auto daria =
Account(
"daria");
1246 BEAST_EXPECT(env.
current()->fees().base == 10);
1274 auto aliceSeq = env.
seq(alice);
1275 auto bobSeq = env.
seq(bob);
1276 auto charlieSeq = env.
seq(charlie);
1277 auto dariaSeq = env.
seq(daria);
1278 auto elmoSeq = env.
seq(elmo);
1279 auto fredSeq = env.
seq(fred);
1280 auto gwenSeq = env.
seq(gwen);
1281 auto hankSeq = env.
seq(hank);
1287 env(
noop(alice),
fee(15), queued);
1288 env(
noop(bob),
fee(15), queued);
1289 env(
noop(charlie),
fee(15), queued);
1290 env(
noop(daria),
fee(15), queued);
1291 env(
noop(elmo),
fee(15), queued);
1292 env(
noop(fred),
fee(15), queued);
1293 env(
noop(gwen),
fee(15), queued);
1294 env(
noop(hank),
fee(15), queued);
1309 env(
noop(charlie),
fee(100),
seq(charlieSeq + 1), queued);
1323 aliceSeq + bobSeq + charlieSeq + dariaSeq + elmoSeq + fredSeq + gwenSeq + hankSeq + 6 ==
1324 env.
seq(alice) + env.
seq(bob) + env.
seq(charlie) + env.
seq(daria) + env.
seq(elmo) +
1325 env.
seq(fred) + env.
seq(gwen) + env.
seq(hank));
1327 using namespace std::string_literals;
1329 aliceSeq == env.
seq(alice),
1332 bobSeq + 1 == env.
seq(bob),
1335 charlieSeq + 2 == env.
seq(charlie),
1338 dariaSeq + 1 == env.
seq(daria),
1341 elmoSeq + 1 == env.
seq(elmo),
1344 fredSeq == env.
seq(fred),
1347 gwenSeq == env.
seq(gwen),
1350 hankSeq + 1 == env.
seq(hank),
1364 auto getTxsQueued = [&]() {
1367 for (
auto const& tx : txs)
1369 ++result[tx.txn->at(sfAccount)];
1373 auto qTxCount1 = getTxsQueued();
1374 BEAST_EXPECT(qTxCount1.size() <= 3);
1377 env(
noop(alice),
seq(aliceSeq + qTxCount1[alice.id()]++),
fee(15), queued);
1378 env(
noop(bob),
seq(bobSeq + qTxCount1[bob.id()]++),
fee(15), queued);
1379 env(
noop(charlie),
seq(charlieSeq + qTxCount1[charlie.id()]++),
fee(15), queued);
1380 env(
noop(daria),
seq(dariaSeq + qTxCount1[daria.id()]++),
fee(15), queued);
1381 env(
noop(elmo),
seq(elmoSeq + qTxCount1[elmo.id()]++),
fee(15), queued);
1382 env(
noop(fred),
seq(fredSeq + qTxCount1[fred.id()]++),
fee(15), queued);
1383 env(
noop(gwen),
seq(gwenSeq + qTxCount1[gwen.id()]++),
fee(15), queued);
1391 env(
noop(alice),
fee(100),
seq(aliceSeq + qTxCount1[alice.id()]++), queued);
1402 auto qTxCount2 = getTxsQueued();
1403 BEAST_EXPECT(qTxCount2.size() <= 4);
1408 aliceSeq + bobSeq + charlieSeq + dariaSeq + elmoSeq + fredSeq + gwenSeq + hankSeq + 7 ==
1409 env.
seq(alice) + env.
seq(bob) + env.
seq(charlie) + env.
seq(daria) + env.
seq(elmo) +
1410 env.
seq(fred) + env.
seq(gwen) + env.
seq(hank));
1413 aliceSeq + qTxCount1[alice.id()] - qTxCount2[alice.id()] == env.
seq(alice),
1416 bobSeq + qTxCount1[bob.id()] - qTxCount2[bob.id()] == env.
seq(bob),
1419 charlieSeq + qTxCount1[charlie.id()] - qTxCount2[charlie.id()] == env.
seq(charlie),
1422 dariaSeq + qTxCount1[daria.id()] - qTxCount2[daria.id()] == env.
seq(daria),
1425 elmoSeq + qTxCount1[elmo.id()] - qTxCount2[elmo.id()] == env.
seq(elmo),
1428 fredSeq + qTxCount1[fred.id()] - qTxCount2[fred.id()] == env.
seq(fred),
1431 gwenSeq + qTxCount1[gwen.id()] - qTxCount2[gwen.id()] == env.
seq(gwen),
1434 hankSeq + qTxCount1[hank.id()] - qTxCount2[hank.id()] == env.
seq(hank),
1961 using namespace jtx;
1962 testcase(
"In-flight balance checks");
1967 {{
"minimum_txn_in_ledger_standalone",
"3"}},
1968 {{
"account_reserve",
"200"}, {
"owner_reserve",
"50"}}));
1970 auto alice =
Account(
"alice");
1971 auto charlie =
Account(
"charlie");
1982 auto const initQueueMax =
initFee(env, 3, 2, 10, 200, 50);
1989 checkMetrics(*
this, env, 0, initQueueMax, limit + 1, limit);
1991 auto USD = gw[
"USD"];
1992 auto BUX = gw[
"BUX"];
1996 auto aliceSeq = env.
seq(alice);
1997 auto aliceBal = env.
balance(alice);
2003 env(
offer(alice, BUX(5000),
XRP(50000)), queued);
2004 checkMetrics(*
this, env, 1, initQueueMax, limit + 1, limit);
2008 env(
noop(alice),
seq(aliceSeq + 1), queued);
2009 checkMetrics(*
this, env, 2, initQueueMax, limit + 1, limit);
2025 checkMetrics(*
this, env, 0, limit * 2, limit + 1, limit);
2026 aliceSeq = env.
seq(alice);
2027 aliceBal = env.
balance(alice);
2033 checkMetrics(*
this, env, 1, limit * 2, limit + 1, limit);
2038 checkMetrics(*
this, env, 2, limit * 2, limit + 1, limit);
2043 checkMetrics(*
this, env, 2, limit * 2, limit + 1, limit);
2059 checkMetrics(*
this, env, 0, limit * 2, limit + 1, limit);
2060 aliceSeq = env.
seq(alice);
2061 aliceBal = env.
balance(alice);
2068 checkMetrics(*
this, env, 1, limit * 2, limit + 1, limit);
2073 checkMetrics(*
this, env, 1, limit * 2, limit + 1, limit);
2089 checkMetrics(*
this, env, 0, limit * 2, limit + 1, limit);
2090 aliceSeq = env.
seq(alice);
2091 aliceBal = env.
balance(alice);
2095 env(
offer(alice, BUX(50),
XRP(500)), queued);
2098 env(
noop(alice),
seq(aliceSeq + 1), queued);
2099 checkMetrics(*
this, env, 2, limit * 2, limit + 1, limit);
2115 checkMetrics(*
this, env, 0, limit * 2, limit + 1, limit);
2117 aliceSeq = env.
seq(alice);
2118 aliceBal = env.
balance(alice);
2123 env(
pay(alice, charlie,
XRP(50000)), queued);
2127 env(
noop(alice),
seq(aliceSeq + 1), queued);
2128 checkMetrics(*
this, env, 2, limit * 2, limit + 1, limit);
2142 checkMetrics(*
this, env, 0, limit * 2, limit + 1, limit);
2144 aliceSeq = env.
seq(alice);
2145 aliceBal = env.
balance(alice);
2149 env(
pay(alice, charlie,
XRP(500)), queued);
2152 env(
noop(alice),
seq(aliceSeq + 1), queued);
2153 checkMetrics(*
this, env, 2, limit * 2, limit + 1, limit);
2164 auto const amount = USD(500000);
2165 env(
trust(alice, USD(50000000)));
2166 env(
trust(charlie, USD(50000000)));
2179 checkMetrics(*
this, env, 0, limit * 2, limit + 1, limit);
2181 aliceSeq = env.
seq(alice);
2182 aliceBal = env.
balance(alice);
2183 auto aliceUSD = env.
balance(alice, USD);
2187 env(
pay(alice, charlie,
amount), queued);
2191 env(
noop(alice),
seq(aliceSeq + 1), queued);
2192 checkMetrics(*
this, env, 2, limit * 2, limit + 1, limit);
2210 env(
offer(gw,
XRP(500000), USD(50000)));
2216 checkMetrics(*
this, env, 0, limit * 2, limit + 1, limit);
2218 aliceSeq = env.
seq(alice);
2219 aliceBal = env.
balance(alice);
2220 auto charlieUSD = env.
balance(charlie, USD);
2226 BEAST_EXPECT(
XRP(60000) > aliceBal);
2227 env(
pay(alice, charlie, USD(1000)),
sendmax(
XRP(60000)), queued);
2231 env(
noop(alice),
seq(aliceSeq + 1), queued);
2232 checkMetrics(*
this, env, 2, limit * 2, limit + 1, limit);
2243 balance(charlie, charlieUSD + USD(1000)),
2251 checkMetrics(*
this, env, 0, limit * 2, limit + 1, limit);
2253 aliceSeq = env.
seq(alice);
2254 aliceBal = env.
balance(alice);
2255 charlieUSD = env.
balance(charlie, USD);
2261 BEAST_EXPECT(aliceBal >
XRP(6001));
2262 env(
pay(alice, charlie, USD(500)),
sendmax(
XRP(6000)), queued);
2265 env(
noop(alice),
seq(aliceSeq + 1), queued);
2266 checkMetrics(*
this, env, 2, limit * 2, limit + 1, limit);
2277 balance(charlie, charlieUSD + USD(500)),
2287 checkMetrics(*
this, env, 0, limit * 2, limit + 1, limit);
2289 aliceSeq = env.
seq(alice);
2290 aliceBal = env.
balance(alice);
2291 BEAST_EXPECT(aliceBal ==
drops(30));
2297 checkMetrics(*
this, env, 1, limit * 2, limit + 1, limit);
2458 using namespace jtx;
2463 auto fee = env.
rpc(
"fee");
2465 if (BEAST_EXPECT(
fee.isMember(jss::result)) &&
2468 auto const& result =
fee[jss::result];
2470 result.isMember(jss::ledger_current_index) &&
2471 result[jss::ledger_current_index] == 3);
2472 BEAST_EXPECT(result.isMember(jss::current_ledger_size));
2473 BEAST_EXPECT(result.isMember(jss::current_queue_size));
2474 BEAST_EXPECT(result.isMember(jss::expected_ledger_size));
2475 BEAST_EXPECT(!result.isMember(jss::max_queue_size));
2476 BEAST_EXPECT(result.isMember(jss::drops));
2477 auto const&
drops = result[jss::drops];
2478 BEAST_EXPECT(
drops.isMember(jss::base_fee));
2479 BEAST_EXPECT(
drops.isMember(jss::median_fee));
2480 BEAST_EXPECT(
drops.isMember(jss::minimum_fee));
2481 BEAST_EXPECT(
drops.isMember(jss::open_ledger_fee));
2482 BEAST_EXPECT(result.isMember(jss::levels));
2483 auto const& levels = result[jss::levels];
2484 BEAST_EXPECT(levels.isMember(jss::median_level));
2485 BEAST_EXPECT(levels.isMember(jss::minimum_level));
2486 BEAST_EXPECT(levels.isMember(jss::open_ledger_level));
2487 BEAST_EXPECT(levels.isMember(jss::reference_level));
2494 if (BEAST_EXPECT(
fee.isMember(jss::result)) &&
2497 auto const& result =
fee[jss::result];
2499 result.isMember(jss::ledger_current_index) &&
2500 result[jss::ledger_current_index] == 4);
2501 BEAST_EXPECT(result.isMember(jss::current_ledger_size));
2502 BEAST_EXPECT(result.isMember(jss::current_queue_size));
2503 BEAST_EXPECT(result.isMember(jss::expected_ledger_size));
2504 BEAST_EXPECT(result.isMember(jss::max_queue_size));
2505 auto const&
drops = result[jss::drops];
2506 BEAST_EXPECT(
drops.isMember(jss::base_fee));
2507 BEAST_EXPECT(
drops.isMember(jss::median_fee));
2508 BEAST_EXPECT(
drops.isMember(jss::minimum_fee));
2509 BEAST_EXPECT(
drops.isMember(jss::open_ledger_fee));
2510 BEAST_EXPECT(result.isMember(jss::levels));
2511 auto const& levels = result[jss::levels];
2512 BEAST_EXPECT(levels.isMember(jss::median_level));
2513 BEAST_EXPECT(levels.isMember(jss::minimum_level));
2514 BEAST_EXPECT(levels.isMember(jss::open_ledger_level));
2515 BEAST_EXPECT(levels.isMember(jss::reference_level));
2879 using namespace jtx;
2882 Env env(*
this,
makeConfig({{
"minimum_txn_in_ledger_standalone",
"3"}}));
2883 auto const baseFee = env.
current()->fees().base.drops();
2887 env.
fund(
XRP(1000000), alice);
2891 withQueue[jss::account] = alice.human();
2892 withQueue[jss::queue] =
true;
2895 withoutQueue[jss::account] = alice.human();
2898 prevLedgerWithQueue[jss::account] = alice.human();
2899 prevLedgerWithQueue[jss::queue] =
true;
2900 prevLedgerWithQueue[jss::ledger_index] = 3;
2901 BEAST_EXPECT(env.
current()->header().seq > 3);
2905 auto const info = env.
rpc(
"json",
"account_info",
to_string(withoutQueue));
2907 info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
2908 BEAST_EXPECT(!info[jss::result].isMember(jss::queue_data));
2912 auto const info = env.
rpc(
"json",
"account_info",
to_string(withQueue));
2914 info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
2915 auto const& result = info[jss::result];
2916 BEAST_EXPECT(result.isMember(jss::queue_data));
2917 auto const& queue_data = result[jss::queue_data];
2918 BEAST_EXPECT(queue_data.isObject());
2919 BEAST_EXPECT(queue_data.isMember(jss::txn_count));
2920 BEAST_EXPECT(queue_data[jss::txn_count] == 0);
2921 BEAST_EXPECT(!queue_data.isMember(jss::lowest_sequence));
2922 BEAST_EXPECT(!queue_data.isMember(jss::highest_sequence));
2923 BEAST_EXPECT(!queue_data.isMember(jss::auth_change_queued));
2924 BEAST_EXPECT(!queue_data.isMember(jss::max_spend_drops_total));
2925 BEAST_EXPECT(!queue_data.isMember(jss::transactions));
2933 auto const info = env.
rpc(
"json",
"account_info",
to_string(withQueue));
2935 info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
2936 auto const& result = info[jss::result];
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] == 0);
2942 BEAST_EXPECT(!queue_data.isMember(jss::lowest_sequence));
2943 BEAST_EXPECT(!queue_data.isMember(jss::highest_sequence));
2944 BEAST_EXPECT(!queue_data.isMember(jss::auth_change_queued));
2945 BEAST_EXPECT(!queue_data.isMember(jss::max_spend_drops_total));
2946 BEAST_EXPECT(!queue_data.isMember(jss::transactions));
2957 auto const info = env.
rpc(
"json",
"account_info",
to_string(withQueue));
2959 info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
2960 auto const& result = info[jss::result];
2961 auto const&
data = result[jss::account_data];
2962 BEAST_EXPECT(result.isMember(jss::queue_data));
2963 auto const& queue_data = result[jss::queue_data];
2964 BEAST_EXPECT(queue_data.isObject());
2965 BEAST_EXPECT(queue_data.isMember(jss::txn_count));
2966 BEAST_EXPECT(queue_data[jss::txn_count] == 4);
2967 BEAST_EXPECT(queue_data.isMember(jss::lowest_sequence));
2968 BEAST_EXPECT(queue_data[jss::lowest_sequence] ==
data[jss::Sequence]);
2969 BEAST_EXPECT(queue_data.isMember(jss::highest_sequence));
2971 queue_data[jss::highest_sequence] ==
2972 data[jss::Sequence].asUInt() + queue_data[jss::txn_count].asUInt() - 1);
2973 BEAST_EXPECT(queue_data.isMember(jss::auth_change_queued));
2974 BEAST_EXPECT(queue_data[jss::auth_change_queued] ==
false);
2975 BEAST_EXPECT(queue_data.isMember(jss::max_spend_drops_total));
2976 BEAST_EXPECT(queue_data[jss::max_spend_drops_total] ==
std::to_string(baseFee * 40));
2977 BEAST_EXPECT(queue_data.isMember(jss::transactions));
2978 auto const& queued = queue_data[jss::transactions];
2979 BEAST_EXPECT(queued.size() == queue_data[jss::txn_count]);
2980 for (
unsigned i = 0; i < queued.size(); ++i)
2982 auto const& item = queued[i];
2983 BEAST_EXPECT(item[jss::seq] ==
data[jss::Sequence].asInt() + i);
2985 BEAST_EXPECT(!item.isMember(jss::LastLedgerSequence));
2987 BEAST_EXPECT(item.isMember(jss::fee));
2989 BEAST_EXPECT(item.isMember(jss::max_spend_drops));
2990 BEAST_EXPECT(item[jss::max_spend_drops] ==
std::to_string(baseFee * 10));
2991 BEAST_EXPECT(item.isMember(jss::auth_change));
2992 BEAST_EXPECT(item[jss::auth_change].asBool() ==
false);
3004 fset(alice, asfAccountTxnID),
3007 json(jss::LastLedgerSequence, 10),
3012 auto const info = env.
rpc(
"json",
"account_info",
to_string(withQueue));
3014 info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
3015 auto const& result = info[jss::result];
3016 auto const&
data = result[jss::account_data];
3017 BEAST_EXPECT(result.isMember(jss::queue_data));
3018 auto const& queue_data = result[jss::queue_data];
3019 BEAST_EXPECT(queue_data.isObject());
3020 BEAST_EXPECT(queue_data.isMember(jss::txn_count));
3021 BEAST_EXPECT(queue_data[jss::txn_count] == 1);
3022 BEAST_EXPECT(queue_data.isMember(jss::lowest_sequence));
3023 BEAST_EXPECT(queue_data[jss::lowest_sequence] ==
data[jss::Sequence]);
3024 BEAST_EXPECT(queue_data.isMember(jss::highest_sequence));
3026 queue_data[jss::highest_sequence] ==
3027 data[jss::Sequence].asUInt() + queue_data[jss::txn_count].asUInt() - 1);
3028 BEAST_EXPECT(queue_data.isMember(jss::auth_change_queued));
3029 BEAST_EXPECT(queue_data[jss::auth_change_queued] ==
true);
3030 BEAST_EXPECT(queue_data.isMember(jss::max_spend_drops_total));
3031 BEAST_EXPECT(queue_data[jss::max_spend_drops_total] ==
std::to_string(baseFee * 10));
3032 BEAST_EXPECT(queue_data.isMember(jss::transactions));
3033 auto const& queued = queue_data[jss::transactions];
3034 BEAST_EXPECT(queued.size() == queue_data[jss::txn_count]);
3035 for (
unsigned i = 0; i < queued.size(); ++i)
3037 auto const& item = queued[i];
3038 BEAST_EXPECT(item[jss::seq] ==
data[jss::Sequence].asInt() + i);
3040 BEAST_EXPECT(item.isMember(jss::fee));
3042 BEAST_EXPECT(item.isMember(jss::max_spend_drops));
3043 BEAST_EXPECT(item[jss::max_spend_drops] ==
std::to_string(baseFee * 10));
3044 BEAST_EXPECT(item.isMember(jss::auth_change));
3046 if (i == queued.size() - 1)
3048 BEAST_EXPECT(item[jss::auth_change].asBool() ==
true);
3049 BEAST_EXPECT(item.isMember(jss::LastLedgerSequence));
3050 BEAST_EXPECT(item[jss::LastLedgerSequence] == 10);
3054 BEAST_EXPECT(item[jss::auth_change].asBool() ==
false);
3055 BEAST_EXPECT(!item.isMember(jss::LastLedgerSequence));
3065 auto const info = env.
rpc(
"json",
"account_info",
to_string(withQueue));
3067 info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
3068 auto const& result = info[jss::result];
3069 auto const&
data = result[jss::account_data];
3070 BEAST_EXPECT(result.isMember(jss::queue_data));
3071 auto const& queue_data = result[jss::queue_data];
3072 BEAST_EXPECT(queue_data.isObject());
3073 BEAST_EXPECT(queue_data.isMember(jss::txn_count));
3074 BEAST_EXPECT(queue_data[jss::txn_count] == 1);
3075 BEAST_EXPECT(queue_data.isMember(jss::lowest_sequence));
3076 BEAST_EXPECT(queue_data[jss::lowest_sequence] ==
data[jss::Sequence]);
3077 BEAST_EXPECT(queue_data.isMember(jss::highest_sequence));
3079 queue_data[jss::highest_sequence] ==
3080 data[jss::Sequence].asUInt() + queue_data[jss::txn_count].asUInt() - 1);
3081 BEAST_EXPECT(queue_data.isMember(jss::auth_change_queued));
3082 BEAST_EXPECT(queue_data[jss::auth_change_queued].asBool());
3083 BEAST_EXPECT(queue_data.isMember(jss::max_spend_drops_total));
3084 BEAST_EXPECT(queue_data[jss::max_spend_drops_total] ==
std::to_string(baseFee * 10));
3085 BEAST_EXPECT(queue_data.isMember(jss::transactions));
3086 auto const& queued = queue_data[jss::transactions];
3087 BEAST_EXPECT(queued.size() == queue_data[jss::txn_count]);
3088 for (
unsigned i = 0; i < queued.size(); ++i)
3090 auto const& item = queued[i];
3091 BEAST_EXPECT(item[jss::seq] ==
data[jss::Sequence].asInt() + i);
3094 if (i == queued.size() - 1)
3096 BEAST_EXPECT(item.isMember(jss::fee));
3098 BEAST_EXPECT(item.isMember(jss::max_spend_drops));
3099 BEAST_EXPECT(item[jss::max_spend_drops] ==
std::to_string(baseFee * 10));
3100 BEAST_EXPECT(item.isMember(jss::auth_change));
3101 BEAST_EXPECT(item[jss::auth_change].asBool());
3102 BEAST_EXPECT(item.isMember(jss::LastLedgerSequence));
3103 BEAST_EXPECT(item[jss::LastLedgerSequence] == 10);
3107 BEAST_EXPECT(item.isMember(jss::fee));
3109 BEAST_EXPECT(item.isMember(jss::max_spend_drops));
3110 BEAST_EXPECT(item[jss::max_spend_drops] ==
std::to_string(baseFee * 10));
3111 BEAST_EXPECT(item.isMember(jss::auth_change));
3112 BEAST_EXPECT(!item[jss::auth_change].asBool());
3113 BEAST_EXPECT(!item.isMember(jss::LastLedgerSequence));
3119 auto const info = env.
rpc(
"json",
"account_info",
to_string(prevLedgerWithQueue));
3129 auto const info = env.
rpc(
"json",
"account_info",
to_string(withQueue));
3131 info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
3132 auto const& result = info[jss::result];
3133 BEAST_EXPECT(result.isMember(jss::queue_data));
3134 auto const& queue_data = result[jss::queue_data];
3135 BEAST_EXPECT(queue_data.isObject());
3136 BEAST_EXPECT(queue_data.isMember(jss::txn_count));
3137 BEAST_EXPECT(queue_data[jss::txn_count] == 0);
3138 BEAST_EXPECT(!queue_data.isMember(jss::lowest_sequence));
3139 BEAST_EXPECT(!queue_data.isMember(jss::highest_sequence));
3140 BEAST_EXPECT(!queue_data.isMember(jss::auth_change_queued));
3141 BEAST_EXPECT(!queue_data.isMember(jss::max_spend_drops_total));
3142 BEAST_EXPECT(!queue_data.isMember(jss::transactions));
3149 using namespace jtx;
3152 Env env(*
this,
makeConfig({{
"minimum_txn_in_ledger_standalone",
"3"}}));
3153 auto const baseFee = env.
current()->fees().base.drops();
3157 env.
fund(
XRP(1000000), alice);
3161 auto const server_info = env.
rpc(
"server_info");
3163 server_info.isMember(jss::result) && server_info[jss::result].isMember(jss::info));
3164 auto const& info = server_info[jss::result][jss::info];
3165 BEAST_EXPECT(info.isMember(jss::load_factor) && info[jss::load_factor] == 1);
3166 BEAST_EXPECT(!info.isMember(jss::load_factor_server));
3167 BEAST_EXPECT(!info.isMember(jss::load_factor_local));
3168 BEAST_EXPECT(!info.isMember(jss::load_factor_net));
3169 BEAST_EXPECT(!info.isMember(jss::load_factor_fee_escalation));
3172 auto const server_state = env.
rpc(
"server_state");
3173 auto const& state = server_state[jss::result][jss::state];
3174 BEAST_EXPECT(state.isMember(jss::load_factor) && state[jss::load_factor] == 256);
3175 BEAST_EXPECT(state.isMember(jss::load_base) && state[jss::load_base] == 256);
3177 state.isMember(jss::load_factor_server) && state[jss::load_factor_server] == 256);
3179 state.isMember(jss::load_factor_fee_escalation) &&
3180 state[jss::load_factor_fee_escalation] == 256);
3182 state.isMember(jss::load_factor_fee_queue) &&
3183 state[jss::load_factor_fee_queue] == 256);
3185 state.isMember(jss::load_factor_fee_reference) &&
3186 state[jss::load_factor_fee_reference] == 256);
3194 auto aliceSeq = env.
seq(alice);
3196 for (
auto i = 0; i < 4; ++i)
3201 auto const server_info = env.
rpc(
"server_info");
3203 server_info.isMember(jss::result) && server_info[jss::result].isMember(jss::info));
3204 auto const& info = server_info[jss::result][jss::info];
3207 info.isMember(jss::load_factor) && info[jss::load_factor] > 888.88 &&
3208 info[jss::load_factor] < 888.89);
3210 info.isMember(jss::load_factor_server) && info[jss::load_factor_server] == 1);
3211 BEAST_EXPECT(!info.isMember(jss::load_factor_local));
3212 BEAST_EXPECT(!info.isMember(jss::load_factor_net));
3214 info.isMember(jss::load_factor_fee_escalation) &&
3215 info[jss::load_factor_fee_escalation] > 888.88 &&
3216 info[jss::load_factor_fee_escalation] < 888.89);
3219 auto const server_state = env.
rpc(
"server_state");
3220 auto const& state = server_state[jss::result][jss::state];
3221 BEAST_EXPECT(state.isMember(jss::load_factor) && state[jss::load_factor] == 227555);
3222 BEAST_EXPECT(state.isMember(jss::load_base) && state[jss::load_base] == 256);
3224 state.isMember(jss::load_factor_server) && state[jss::load_factor_server] == 256);
3226 state.isMember(jss::load_factor_fee_escalation) &&
3227 state[jss::load_factor_fee_escalation] == 227555);
3229 state.isMember(jss::load_factor_fee_queue) &&
3230 state[jss::load_factor_fee_queue] == 256);
3232 state.isMember(jss::load_factor_fee_reference) &&
3233 state[jss::load_factor_fee_reference] == 256);
3239 auto const server_info = env.
rpc(
"server_info");
3241 server_info.isMember(jss::result) && server_info[jss::result].isMember(jss::info));
3242 auto const& info = server_info[jss::result][jss::info];
3244 BEAST_EXPECT(info.isMember(jss::load_factor) && info[jss::load_factor] == 1000);
3245 BEAST_EXPECT(!info.isMember(jss::load_factor_server));
3246 BEAST_EXPECT(!info.isMember(jss::load_factor_local));
3247 BEAST_EXPECT(info.isMember(jss::load_factor_net) && info[jss::load_factor_net] == 1000);
3249 info.isMember(jss::load_factor_fee_escalation) &&
3250 info[jss::load_factor_fee_escalation] > 888.88 &&
3251 info[jss::load_factor_fee_escalation] < 888.89);
3254 auto const server_state = env.
rpc(
"server_state");
3255 auto const& state = server_state[jss::result][jss::state];
3256 BEAST_EXPECT(state.isMember(jss::load_factor) && state[jss::load_factor] == 256000);
3257 BEAST_EXPECT(state.isMember(jss::load_base) && state[jss::load_base] == 256);
3259 state.isMember(jss::load_factor_server) &&
3260 state[jss::load_factor_server] == 256000);
3262 state.isMember(jss::load_factor_fee_escalation) &&
3263 state[jss::load_factor_fee_escalation] == 227555);
3265 state.isMember(jss::load_factor_fee_queue) &&
3266 state[jss::load_factor_fee_queue] == 256);
3268 state.isMember(jss::load_factor_fee_reference) &&
3269 state[jss::load_factor_fee_reference] == 256);
3275 for (
int i = 0; i < 5; ++i)
3280 auto const server_info = env.
rpc(
"server_info");
3282 server_info.isMember(jss::result) && server_info[jss::result].isMember(jss::info));
3283 auto const& info = server_info[jss::result][jss::info];
3286 info.isMember(jss::load_factor) && info[jss::load_factor] > 888.88 &&
3287 info[jss::load_factor] < 888.89);
3292 info.isMember(jss::load_factor_server) && info[jss::load_factor_server] > 1.245 &&
3293 info[jss::load_factor_server] < 2.4415);
3295 info.isMember(jss::load_factor_local) && info[jss::load_factor_local] > 1.245 &&
3296 info[jss::load_factor_local] < 2.4415);
3297 BEAST_EXPECT(!info.isMember(jss::load_factor_net));
3299 info.isMember(jss::load_factor_fee_escalation) &&
3300 info[jss::load_factor_fee_escalation] > 888.88 &&
3301 info[jss::load_factor_fee_escalation] < 888.89);
3304 auto const server_state = env.
rpc(
"server_state");
3305 auto const& state = server_state[jss::result][jss::state];
3306 BEAST_EXPECT(state.isMember(jss::load_factor) && state[jss::load_factor] == 227555);
3307 BEAST_EXPECT(state.isMember(jss::load_base) && state[jss::load_base] == 256);
3312 state.isMember(jss::load_factor_server) && state[jss::load_factor_server] >= 320 &&
3313 state[jss::load_factor_server] <= 625);
3315 state.isMember(jss::load_factor_fee_escalation) &&
3316 state[jss::load_factor_fee_escalation] == 227555);
3318 state.isMember(jss::load_factor_fee_queue) &&
3319 state[jss::load_factor_fee_queue] == 256);
3321 state.isMember(jss::load_factor_fee_reference) &&
3322 state[jss::load_factor_fee_reference] == 256);
3328 auto const server_info = env.
rpc(
"server_info");
3330 server_info.isMember(jss::result) && server_info[jss::result].isMember(jss::info));
3331 auto const& info = server_info[jss::result][jss::info];
3338 info.isMember(jss::load_factor) && info[jss::load_factor] > 1.245 &&
3339 info[jss::load_factor] < 2.4415);
3340 BEAST_EXPECT(!info.isMember(jss::load_factor_server));
3342 info.isMember(jss::load_factor_local) && info[jss::load_factor_local] > 1.245 &&
3343 info[jss::load_factor_local] < 2.4415);
3344 BEAST_EXPECT(!info.isMember(jss::load_factor_net));
3345 BEAST_EXPECT(!info.isMember(jss::load_factor_fee_escalation));
3348 auto const server_state = env.
rpc(
"server_state");
3349 auto const& state = server_state[jss::result][jss::state];
3351 state.isMember(jss::load_factor) && state[jss::load_factor] >= 320 &&
3352 state[jss::load_factor] <= 625);
3353 BEAST_EXPECT(state.isMember(jss::load_base) && state[jss::load_base] == 256);
3358 state.isMember(jss::load_factor_server) && state[jss::load_factor_server] >= 320 &&
3359 state[jss::load_factor_server] <= 625);
3361 state.isMember(jss::load_factor_fee_escalation) &&
3362 state[jss::load_factor_fee_escalation] == 256);
3364 state.isMember(jss::load_factor_fee_queue) &&
3365 state[jss::load_factor_fee_queue] == 256);
3367 state.isMember(jss::load_factor_fee_reference) &&
3368 state[jss::load_factor_fee_reference] == 256);
3375 using namespace jtx;
3378 Env env(*
this,
makeConfig({{
"minimum_txn_in_ledger_standalone",
"3"}}));
3379 auto const baseFee = env.
current()->fees().base.drops();
3383 stream[jss::streams].append(
"server");
3386 auto jv = wsc->invoke(
"subscribe", stream);
3387 BEAST_EXPECT(jv[jss::status] ==
"success");
3391 Account a{
"a"}, b{
"b"}, c{
"c"}, d{
"d"}, e{
"e"}, f{
"f"}, g{
"g"}, h{
"h"}, i{
"i"};
3398 using namespace std::chrono_literals;
3399 BEAST_EXPECT(wsc->findMsg(5s, [&](
auto const& jv) {
3400 return jv[jss::type] ==
"serverStatus" && jv.isMember(jss::load_factor) &&
3401 jv[jss::load_factor] == 256 && jv.isMember(jss::load_base) &&
3402 jv[jss::load_base] == 256 && jv.isMember(jss::load_factor_server) &&
3403 jv[jss::load_factor_server] == 256 &&
3404 jv.isMember(jss::load_factor_fee_escalation) &&
3405 jv[jss::load_factor_fee_escalation] == 256 &&
3406 jv.isMember(jss::load_factor_fee_queue) && jv[jss::load_factor_fee_queue] == 256 &&
3407 jv.isMember(jss::load_factor_fee_reference) &&
3408 jv[jss::load_factor_fee_reference] == 256;
3411 BEAST_EXPECT(wsc->findMsg(5s, [&](
auto const& jv) {
3412 return jv[jss::type] ==
"serverStatus" && jv.isMember(jss::load_factor) &&
3413 jv[jss::load_factor] == 227555 && jv.isMember(jss::load_base) &&
3414 jv[jss::load_base] == 256 && jv.isMember(jss::load_factor_server) &&
3415 jv[jss::load_factor_server] == 256 &&
3416 jv.isMember(jss::load_factor_fee_escalation) &&
3417 jv[jss::load_factor_fee_escalation] == 227555 &&
3418 jv.isMember(jss::load_factor_fee_queue) && jv[jss::load_factor_fee_queue] == 256 &&
3419 jv.isMember(jss::load_factor_fee_reference) &&
3420 jv[jss::load_factor_fee_reference] == 256;
3426 BEAST_EXPECT(wsc->findMsg(5s, [&](
auto const& jv) {
3427 return jv[jss::type] ==
"serverStatus" && jv.isMember(jss::load_factor) &&
3428 jv[jss::load_factor] == 256 && jv.isMember(jss::load_base) &&
3429 jv[jss::load_base] == 256 && jv.isMember(jss::load_factor_server) &&
3430 jv[jss::load_factor_server] == 256 &&
3431 jv.isMember(jss::load_factor_fee_escalation) &&
3432 jv[jss::load_factor_fee_escalation] == 256 &&
3433 jv.isMember(jss::load_factor_fee_queue) && jv[jss::load_factor_fee_queue] == 256 &&
3434 jv.isMember(jss::load_factor_fee_reference) &&
3435 jv[jss::load_factor_fee_reference] == 256;
3445 env(
noop(a),
fee(baseFee), queued);
3446 env(
noop(b),
fee(baseFee), queued);
3447 env(
noop(c),
fee(baseFee), queued);
3448 env(
noop(d),
fee(baseFee), queued);
3449 env(
noop(e),
fee(baseFee), queued);
3450 env(
noop(f),
fee(baseFee), queued);
3451 env(
noop(g),
fee(baseFee), queued);
3455 BEAST_EXPECT(wsc->findMsg(5s, [&](
auto const& jv) {
3456 return jv[jss::type] ==
"serverStatus" && jv.isMember(jss::load_factor) &&
3457 jv[jss::load_factor] == 200000 && jv.isMember(jss::load_base) &&
3458 jv[jss::load_base] == 256 && jv.isMember(jss::load_factor_server) &&
3459 jv[jss::load_factor_server] == 256 &&
3460 jv.isMember(jss::load_factor_fee_escalation) &&
3461 jv[jss::load_factor_fee_escalation] == 200000 &&
3462 jv.isMember(jss::load_factor_fee_queue) && jv[jss::load_factor_fee_queue] == 256 &&
3463 jv.isMember(jss::load_factor_fee_reference) &&
3464 jv[jss::load_factor_fee_reference] == 256;
3469 BEAST_EXPECT(wsc->findMsg(5s, [&](
auto const& jv) {
3470 return jv[jss::type] ==
"serverStatus" && jv.isMember(jss::load_factor) &&
3471 jv[jss::load_factor] == 184320 && jv.isMember(jss::load_base) &&
3472 jv[jss::load_base] == 256 && jv.isMember(jss::load_factor_server) &&
3473 jv[jss::load_factor_server] == 256 &&
3474 jv.isMember(jss::load_factor_fee_escalation) &&
3475 jv[jss::load_factor_fee_escalation] == 184320 &&
3476 jv.isMember(jss::load_factor_fee_queue) && jv[jss::load_factor_fee_queue] == 256 &&
3477 jv.isMember(jss::load_factor_fee_reference) &&
3478 jv[jss::load_factor_fee_reference] == 256;
3483 BEAST_EXPECT(wsc->findMsg(5s, [&](
auto const& jv) {
3484 return jv[jss::type] ==
"serverStatus" && jv.isMember(jss::load_factor) &&
3485 jv[jss::load_factor] == 256 && jv.isMember(jss::load_base) &&
3486 jv[jss::load_base] == 256 && jv.isMember(jss::load_factor_server) &&
3487 jv[jss::load_factor_server] == 256 &&
3488 jv.isMember(jss::load_factor_fee_escalation) &&
3489 jv[jss::load_factor_fee_escalation] == 256 &&
3490 jv.isMember(jss::load_factor_fee_queue) && jv[jss::load_factor_fee_queue] == 256 &&
3491 jv.isMember(jss::load_factor_fee_reference) &&
3492 jv[jss::load_factor_fee_reference] == 256;
3496 !wsc->findMsg(1s, [&](
auto const& jv) { return jv[jss::type] ==
"serverStatus"; }));
3498 auto jv = wsc->invoke(
"unsubscribe", stream);
3499 BEAST_EXPECT(jv[jss::status] ==
"success");
3710 using namespace jtx;
3711 using namespace std::chrono_literals;
3718 {{
"minimum_txn_in_ledger_standalone",
"3"},
3719 {
"normal_consensus_increase_percent",
"25"},
3720 {
"slow_consensus_decrease_percent",
"50"},
3721 {
"target_txn_in_ledger",
"10"},
3722 {
"maximum_txn_per_account",
"200"}}));
3723 auto alice =
Account(
"alice");
3726 env.
fund(
XRP(50000000), alice);
3730 auto seqAlice = env.
seq(alice);
3732 for (
int i = 0; i < txCount; ++i)
3776 env.
close(env.
now() + 5s, 10000ms);
3781 env.
close(env.
now() + 5s, 10000ms);
3786 env.
close(env.
now() + 5s, 10000ms);
3793 env.
close(env.
now() + 5s, 10000ms);
3797 BEAST_EXPECT(!txCount);
3804 {{
"minimum_txn_in_ledger_standalone",
"3"},
3805 {
"normal_consensus_increase_percent",
"150"},
3806 {
"slow_consensus_decrease_percent",
"150"},
3807 {
"target_txn_in_ledger",
"10"},
3808 {
"maximum_txn_per_account",
"200"}}));
3809 auto alice =
Account(
"alice");
3812 env.
fund(
XRP(50000000), alice);
3816 auto seqAlice = env.
seq(alice);
3818 for (
int i = 0; i < txCount; ++i)
3837 env.
close(env.
now() + 5s, 10000ms);
3843 BEAST_EXPECT(!txCount);
4014 using namespace jtx;
4023 constexpr int ledgersInQueue = 30;
4025 {{
"minimum_txn_in_ledger_standalone",
"1"},
4027 {
"maximum_txn_per_account",
"10"}},
4028 {{
"account_reserve",
"1000"}, {
"owner_reserve",
"50"}});
4030 auto& votingSection = cfg->section(
"voting");
4031 votingSection.set(
"account_reserve",
std::to_string(cfg->FEES.reference_fee.drops() * 100));
4033 votingSection.set(
"reference_fee",
std::to_string(cfg->FEES.reference_fee.drops()));
4035 Env env(*
this, std::move(cfg));
4051 checkMetrics(*
this, env, 0, ledgersInQueue * metrics.txPerLedger, 0, 2);
4055 for (i = 0; i <= 257; ++i)
4062 checkMetrics(*
this, env, 0, ledgersInQueue * expectedPerLedger, 0, expectedPerLedger);
4067 using namespace std::chrono_literals;
4068 auto closeDuration = 80min;
4069 for (i = 0; i <= 255; ++i)
4071 env.
close(closeDuration);
4074 auto const baseFee = env.
current()->fees().base.drops();
4081 ledgersInQueue * expectedPerLedger,
4082 expectedPerLedger + 1,
4086 auto seqAlice = env.
seq(alice);
4087 auto seqBob = env.
seq(bob);
4088 auto seqCarol = env.
seq(carol);
4089 auto seqDaria = env.
seq(daria);
4090 auto seqEllie = env.
seq(ellie);
4091 auto seqFiona = env.
seq(fiona);
4094 int txFee{
static_cast<int>(baseFee * 9)};
4095 auto prepareFee = [&](
uint64_t multiplier) {
4096 return fee(txFee - (multiplier * baseFee / 10));
4100 for (
int i = 0; i < 10; ++i)
4114 ledgersInQueue * expectedPerLedger,
4115 expectedPerLedger + 1,
4129 env.
close(closeDuration);
4130 auto expectedInLedger = expectedInQueue;
4132 (expectedInQueue > expectedPerLedger + 2 ? expectedInQueue - (expectedPerLedger + 2)
4134 expectedInLedger -= expectedInQueue;
4135 ++expectedPerLedger;
4140 ledgersInQueue * expectedPerLedger,
4144 auto const expectedPerAccount = expectedInQueue / 6;
4145 auto const expectedRemainder = expectedInQueue % 6;
4146 BEAST_EXPECT(env.
seq(alice) == seqAlice - expectedPerAccount);
4148 env.
seq(bob) == seqBob - expectedPerAccount - (expectedRemainder > 4 ? 1 : 0));
4151 seqCarol - expectedPerAccount - (expectedRemainder > 3 ? 1 : 0));
4154 seqDaria - expectedPerAccount - (expectedRemainder > 2 ? 1 : 0));
4157 seqEllie - expectedPerAccount - (expectedRemainder > 1 ? 1 : 0));
4160 seqFiona - expectedPerAccount - (expectedRemainder > 0 ? 1 : 0));
4162 }
while (expectedInQueue > 0);
4491 using namespace jtx;
4499 {{
"minimum_txn_in_ledger_standalone",
"3"}},
4500 {{
"reference_fee",
"0"}, {
"account_reserve",
"0"}, {
"owner_reserve",
"0"}}));
4505 auto const initQueueMax =
initFee(env, 3, 2, 0, 0, 0);
4507 BEAST_EXPECT(env.
current()->fees().base == 0);
4510 auto const fee = env.
rpc(
"fee");
4512 if (BEAST_EXPECT(
fee.isMember(jss::result)) &&
4515 auto const& result =
fee[jss::result];
4517 BEAST_EXPECT(result.isMember(jss::levels));
4518 auto const& levels = result[jss::levels];
4520 levels.isMember(jss::median_level) && levels[jss::median_level] ==
"128000");
4522 levels.isMember(jss::minimum_level) && levels[jss::minimum_level] ==
"256");
4524 levels.isMember(jss::open_ledger_level) &&
4525 levels[jss::open_ledger_level] ==
"256");
4527 levels.isMember(jss::reference_level) && levels[jss::reference_level] ==
"256");
4529 auto const&
drops = result[jss::drops];
4530 BEAST_EXPECT(
drops.isMember(jss::base_fee) &&
drops[jss::base_fee] ==
"0");
4531 BEAST_EXPECT(
drops.isMember(jss::median_fee) &&
drops[jss::median_fee] ==
"0");
4532 BEAST_EXPECT(
drops.isMember(jss::minimum_fee) &&
drops[jss::minimum_fee] ==
"0");
4534 drops.isMember(jss::open_ledger_fee) &&
drops[jss::open_ledger_fee] ==
"0");
4558 auto aliceSeq = env.
seq(alice);
4559 env(
noop(alice), queued);
4563 env(
noop(alice),
seq(aliceSeq + 1),
fee(10), queued);
4568 auto const fee = env.
rpc(
"fee");
4570 if (BEAST_EXPECT(
fee.isMember(jss::result)) &&
4573 auto const& result =
fee[jss::result];
4575 BEAST_EXPECT(result.isMember(jss::levels));
4576 auto const& levels = result[jss::levels];
4578 levels.isMember(jss::median_level) && levels[jss::median_level] ==
"128000");
4580 levels.isMember(jss::minimum_level) && levels[jss::minimum_level] ==
"256");
4582 levels.isMember(jss::open_ledger_level) &&
4583 levels[jss::open_ledger_level] ==
"355555");
4585 levels.isMember(jss::reference_level) && levels[jss::reference_level] ==
"256");
4587 auto const&
drops = result[jss::drops];
4588 BEAST_EXPECT(
drops.isMember(jss::base_fee) &&
drops[jss::base_fee] ==
"0");
4589 BEAST_EXPECT(
drops.isMember(jss::median_fee) &&
drops[jss::median_fee] ==
"0");
4590 BEAST_EXPECT(
drops.isMember(jss::minimum_fee) &&
drops[jss::minimum_fee] ==
"0");
4592 drops.isMember(jss::open_ledger_fee) &&
drops[jss::open_ledger_fee] ==
"1389");