20 #include <ripple/app/main/Application.h>
21 #include <ripple/app/misc/LoadFeeTrack.h>
22 #include <ripple/app/misc/TxQ.h>
23 #include <ripple/app/tx/apply.h>
24 #include <ripple/basics/Log.h>
25 #include <ripple/basics/mulDiv.h>
26 #include <test/jtx/TestSuite.h>
27 #include <test/jtx/envconfig.h>
28 #include <ripple/protocol/ErrorCodes.h>
29 #include <ripple/protocol/Feature.h>
30 #include <ripple/protocol/jss.h>
31 #include <ripple/protocol/st.h>
33 #include <test/jtx/ticket.h>
34 #include <boost/optional.hpp>
35 #include <test/jtx/WSClient.h>
41 class TxQ_test :
public beast::unit_test::suite
47 boost::optional<std::size_t> expectedMaxCount,
53 FeeLevel64 const expectedMin{ expectedMinFeeLevel };
54 FeeLevel64 const expectedMed{ expectedMedFeeLevel };
56 BEAST_EXPECT(metrics.referenceFeeLevel ==
FeeLevel64{ 256 });
57 BEAST_EXPECT(metrics.txCount == expectedCount);
58 BEAST_EXPECT(metrics.txQMaxSize == expectedMaxCount);
59 BEAST_EXPECT(metrics.txInLedger == expectedInLedger);
60 BEAST_EXPECT(metrics.txPerLedger == expectedPerLedger);
61 BEAST_EXPECT(metrics.minProcessingFeeLevel == expectedMin);
62 BEAST_EXPECT(metrics.medFeeLevel == expectedMed);
63 auto expectedCurFeeLevel = expectedInLedger > expectedPerLedger ?
64 expectedMed *expectedInLedger * expectedInLedger /
65 (expectedPerLedger * expectedPerLedger) :
66 metrics.referenceFeeLevel;
67 BEAST_EXPECT(metrics.openLedgerFeeLevel == expectedCurFeeLevel);
76 for (
int i = metrics.txInLedger; i <= metrics.txPerLedger; ++i)
85 auto const& view = *env.
current();
90 view.fees().base).second + 1);
99 auto& section = p->section(
"transaction_queue");
100 section.set(
"ledgers_in_queue",
"2");
101 section.set(
"minimum_queue_size",
"2");
102 section.set(
"min_ledgers_to_compute_size_limit",
"3");
103 section.set(
"max_ledger_counts_to_store",
"100");
104 section.set(
"retry_sequence_percent",
"25");
105 section.set(
"zero_basefee_transaction_feelevel",
"100000000000");
106 section.set(
"normal_consensus_increase_percent",
"0");
108 for (
auto const& [k, v] : extraTxQ)
113 if (!extraVoting.
empty())
116 auto& votingSection = p->section(
"voting");
117 for (
auto const& [k, v] : extraVoting)
119 votingSection.set(k, v);
123 p->section(
"validation_seed").legacy(
"shUwVw52ofnCUX5m7kPTKzJdr4HEH");
137 for(
auto i = env.
current()->seq(); i <= 257; ++i)
144 auto const flagPerLedger = 1 +
146 auto const flagMaxQueue = ledgersInQueue * flagPerLedger;
147 checkMetrics(env, 0, flagMaxQueue, 0, flagPerLedger, 256,
157 using namespace std::chrono_literals;
159 checkMetrics(env, 0, flagMaxQueue, 0, expectedPerLedger, 256);
160 auto const fees = env.
current()->fees();
161 BEAST_EXPECT(fees.base ==
XRPAmount{ base });
162 BEAST_EXPECT(fees.units ==
FeeUnit64{ units });
163 BEAST_EXPECT(fees.reserve ==
XRPAmount{ reserve });
164 BEAST_EXPECT(fees.increment ==
XRPAmount{ increment });
176 makeConfig({ {
"minimum_txn_in_ledger_standalone",
"3"} }));
181 auto charlie =
Account(
"charlie");
190 BEAST_EXPECT(env.
current()->fees().base == 10);
199 env(
noop(alice), queued);
207 env(
noop(daria),
fee(1000), queued);
221 env(
noop(alice),
fee(12), queued);
224 env(
noop(bob),
fee(10), queued);
225 env(
noop(charlie),
fee(20), queued);
226 env(
noop(daria),
fee(15), queued);
227 env(
noop(elmo),
fee(11), queued);
228 env(
noop(fred),
fee(19), queued);
229 env(
noop(gwen),
fee(16), queued);
230 env(
noop(hank),
fee(18), queued);
242 env(
noop(hank),
fee(10), queued);
254 env(
noop(hank),
fee(6000), queued);
267 env(
noop(hank),
fee(6000), queued);
298 env(
noop(daria),
fee(15), queued);
300 env(
noop(elmo),
fee(16), queued);
301 env(
noop(fred),
fee(17), queued);
302 env(
noop(gwen),
fee(18), queued);
303 env(
noop(hank),
fee(19), queued);
304 env(
noop(alice),
fee(20), queued);
316 env(
noop(charlie),
fee(100), queued);
338 auto metrics = txq.getMetrics(*env.
current());
339 BEAST_EXPECT(metrics.txCount == 0);
342 for (
int i = metrics.txInLedger; i <= metrics.txPerLedger; ++i)
352 metrics.txQMaxSize, metrics.txPerLedger + 1,
362 makeConfig({ {
"minimum_txn_in_ledger_standalone",
"2" } }));
366 auto USD = gw[
"USD"];
398 makeConfig({ {
"minimum_txn_in_ledger_standalone",
"2" } }));
402 auto charlie =
Account(
"charlie");
406 BEAST_EXPECT(env.
current()->fees().base == 10);
420 env(
noop(alice), queued);
433 env(
noop(charlie),
fee(1000), queued);
454 makeConfig({ {
"minimum_txn_in_ledger_standalone",
"2" } }));
458 auto charlie =
Account(
"charlie");
461 auto felicia =
Account(
"felicia");
481 BEAST_EXPECT(env.
current()->info().seq == 6);
483 env(
noop(alice),
json(R
"({"LastLedgerSequence":7})"),
486 env(
noop(alice),
json(R
"({"LastLedgerSequence":8})"),
490 env(
noop(bob),
fee(7000), queued);
491 env(
noop(charlie),
fee(7000), queued);
492 env(
noop(daria),
fee(7000), queued);
493 env(
noop(edgar),
fee(7000), queued);
498 BEAST_EXPECT(aliceStat.size() == 1);
499 BEAST_EXPECT(aliceStat.begin()->second.feeLevel ==
501 BEAST_EXPECT(aliceStat.begin()->second.lastValid &&
502 *aliceStat.begin()->second.lastValid == 8);
503 BEAST_EXPECT(!aliceStat.begin()->second.consequences);
505 auto bobStat = txQ.getAccountTxs(bob.id(), *env.
current());
506 BEAST_EXPECT(bobStat.size() == 1);
507 BEAST_EXPECT(bobStat.begin()->second.feeLevel ==
509 BEAST_EXPECT(!bobStat.begin()->second.lastValid);
510 BEAST_EXPECT(!bobStat.begin()->second.consequences);
514 BEAST_EXPECT(noStat.empty());
521 env(
noop(bob),
fee(7000), queued);
522 env(
noop(charlie),
fee(7000), queued);
523 env(
noop(daria),
fee(7000), queued);
524 env(
noop(edgar),
fee(7000), queued);
525 env(
noop(felicia),
fee(7000), queued);
531 BEAST_EXPECT(env.
seq(alice) == 3);
534 env(
noop(bob),
fee(8000), queued);
535 env(
noop(charlie),
fee(8000), queued);
536 env(
noop(daria),
fee(8000), queued);
539 env(
noop(edgar),
fee(8000), queued);
540 env(
noop(felicia),
fee(8000), queued);
550 BEAST_EXPECT(env.
seq(alice) == 3);
555 BEAST_EXPECT(env.
seq(alice) == 3);
564 makeConfig({ {
"minimum_txn_in_ledger_standalone",
"2" } }));
586 env(
noop(bob), queued);
604 auto seqBob = env.
seq(bob);
605 for (
int i = 0; i < 4; ++i)
608 seq(seqBob), queued);
609 feeBob = (feeBob + 1) * 125 / 100;
617 seq(seqBob), queued);
629 auto feeCarol = feeBob;
630 auto seqCarol = env.
seq(carol);
631 for (
int i = 0; i < 3; ++i)
633 env(
noop(carol),
fee(feeCarol),
634 seq(seqCarol), queued);
635 feeCarol = (feeCarol + 1) * 125 / 100;
643 env(
noop(carol),
fee(feeCarol),
651 BEAST_EXPECT(env.
seq(bob) == seqBob - 2);
652 BEAST_EXPECT(env.
seq(carol) == seqCarol);
657 BEAST_EXPECT(env.
seq(bob) == seqBob + 1);
658 BEAST_EXPECT(env.
seq(carol) == seqCarol + 1);
662 BEAST_EXPECT(env.
seq(bob) == seqBob + 1);
663 BEAST_EXPECT(env.
seq(carol) == seqCarol + 1);
682 env(
pay(alice, bob,
XRP(-1000)),
695 makeConfig({ {
"minimum_txn_in_ledger_standalone",
"2" } }));
713 env(
noop(alice), queued);
718 auto const& jt = env.
jt(
noop(alice));
719 BEAST_EXPECT(jt.stx);
750 {{
"minimum_txn_in_ledger_standalone",
"3"}},
751 {{
"account_reserve",
"200"}, {
"owner_reserve",
"50"}}));
755 auto charlie =
Account(
"charlie");
760 BEAST_EXPECT(env.
current()->fees().base == 10);
765 auto const initQueueMax =
initFee(env, 3, 2, 10, 10, 200, 50);
773 env(
noop(alice), queued);
776 auto aliceSeq = env.
seq(alice);
777 auto bobSeq = env.
seq(bob);
778 auto charlieSeq = env.
seq(charlie);
796 env(
noop(bob), queued);
806 env(
noop(charlie),
fee(15), queued);
809 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
810 BEAST_EXPECT(env.
seq(bob) == bobSeq);
811 BEAST_EXPECT(env.
seq(charlie) == charlieSeq);
821 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 3);
822 BEAST_EXPECT(env.
seq(bob) == bobSeq + 1);
823 BEAST_EXPECT(env.
seq(charlie) == charlieSeq + 1);
827 aliceSeq = env.
seq(alice);
828 auto lastLedgerSeq = env.
current()->info().seq + 2;
829 for (
auto i = 0; i < 7; i++)
831 env(
noop(alice),
seq(aliceSeq),
832 json(jss::LastLedgerSequence, lastLedgerSeq + i),
833 fee(aliceFee), queued);
841 auto const& baseFee = env.
current()->fees().base;
842 auto seq = env.
seq(alice);
843 BEAST_EXPECT(aliceStat.size() == 7);
844 for (
auto const& [txSeq, details] : aliceStat)
846 BEAST_EXPECT(txSeq ==
seq);
847 BEAST_EXPECT(details.feeLevel ==
toFeeLevel(
fee, baseFee).second);
848 BEAST_EXPECT(details.lastValid);
849 BEAST_EXPECT((details.consequences &&
850 details.consequences->fee ==
drops(
fee) &&
851 details.consequences->potentialSpend ==
drops(0) &&
853 txSeq == env.
seq(alice) + 6);
861 env(
noop(alice),
seq(aliceSeq),
862 json(jss::LastLedgerSequence, lastLedgerSeq + 7),
874 env(
noop(charlie),
fee(30), queued);
880 env(
noop(alice),
seq(aliceSeq),
887 env(
noop(alice),
seq(aliceSeq - 1),
893 aliceSeq = env.
seq(alice) + 2;
895 env(
noop(alice),
seq(aliceSeq),
901 env(
noop(alice),
seq(aliceSeq),
902 fee(aliceFee), queued);
911 aliceSeq = env.
seq(alice) + 1;
917 aliceFee = env.
le(alice)->getFieldAmount(
sfBalance).xrp().drops()
919 env(
noop(alice),
seq(aliceSeq),
925 env(
noop(alice),
seq(aliceSeq),
932 env(
noop(alice),
seq(aliceSeq),
933 fee(aliceFee), queued);
941 env(
noop(alice),
seq(aliceSeq),
959 bobSeq = env.
seq(bob);
961 for (
int i = 0; i < 10; ++i)
962 env(
noop(bob),
seq(bobSeq + i), queued);
969 env(
noop(bob),
seq(bobSeq + 5),
fee(20), queued);
979 makeConfig({ {
"minimum_txn_in_ledger_standalone",
"4" } }));
983 auto charlie =
Account(
"charlie");
992 BEAST_EXPECT(env.
current()->fees().base == 10);
1020 auto aliceSeq = env.
seq(alice);
1021 auto bobSeq = env.
seq(bob);
1022 auto charlieSeq = env.
seq(charlie);
1023 auto dariaSeq = env.
seq(daria);
1024 auto elmoSeq = env.
seq(elmo);
1025 auto fredSeq = env.
seq(fred);
1026 auto gwenSeq = env.
seq(gwen);
1027 auto hankSeq = env.
seq(hank);
1030 env(
noop(alice),
fee(15), queued);
1031 env(
noop(bob),
fee(15), queued);
1032 env(
noop(charlie),
fee(15), queued);
1033 env(
noop(daria),
fee(15), queued);
1034 env(
noop(elmo),
fee(15), queued);
1035 env(
noop(fred),
fee(15), queued);
1036 env(
noop(gwen),
fee(15), queued);
1039 env(
noop(hank),
fee(15), queued);
1053 env(
noop(charlie),
fee(100),
seq(charlieSeq + 1), queued);
1066 BEAST_EXPECT(aliceSeq + 1 == env.
seq(alice));
1067 BEAST_EXPECT(bobSeq + 1 == env.
seq(bob));
1068 BEAST_EXPECT(charlieSeq + 2 == env.
seq(charlie));
1069 BEAST_EXPECT(dariaSeq + 1 == env.
seq(daria));
1070 BEAST_EXPECT(elmoSeq + 1 == env.
seq(elmo));
1071 BEAST_EXPECT(fredSeq == env.
seq(fred));
1072 BEAST_EXPECT(gwenSeq == env.
seq(gwen));
1073 BEAST_EXPECT(hankSeq == env.
seq(hank));
1075 aliceSeq = env.
seq(alice);
1076 bobSeq = env.
seq(bob);
1077 charlieSeq = env.
seq(charlie);
1078 dariaSeq = env.
seq(daria);
1079 elmoSeq = env.
seq(elmo);
1082 env(
noop(alice),
fee(15), queued);
1083 env(
noop(alice),
seq(aliceSeq + 1),
fee(15), queued);
1084 env(
noop(alice),
seq(aliceSeq + 2),
fee(15), queued);
1085 env(
noop(bob),
fee(15), queued);
1086 env(
noop(charlie),
fee(15), queued);
1087 env(
noop(daria),
fee(15), queued);
1090 env(
noop(elmo),
fee(15), queued);
1096 env(
noop(alice),
fee(100),
seq(aliceSeq + 3), queued);
1101 BEAST_EXPECT(fredSeq + 1 == env.
seq(fred));
1102 BEAST_EXPECT(gwenSeq + 1 == env.
seq(gwen));
1103 BEAST_EXPECT(hankSeq + 1 == env.
seq(hank));
1104 BEAST_EXPECT(aliceSeq + 4 == env.
seq(alice));
1105 BEAST_EXPECT(bobSeq == env.
seq(bob));
1106 BEAST_EXPECT(charlieSeq == env.
seq(charlie));
1107 BEAST_EXPECT(dariaSeq == env.
seq(daria));
1108 BEAST_EXPECT(elmoSeq == env.
seq(elmo));
1113 using namespace jtx;
1116 makeConfig({ {
"minimum_txn_in_ledger_standalone",
"1" } }));
1118 auto alice =
Account(
"alice");
1120 BEAST_EXPECT(env.
current()->fees().base == 10);
1133 env(
noop(alice),
json(R
"({"AccountTxnID": "0"})"),
1145 env(
noop(alice),
json(R
"({"AccountTxnID": "0"})"),
1151 using namespace jtx;
1152 using namespace std::string_literals;
1156 { {
"minimum_txn_in_ledger_standalone",
"2"},
1157 {
"target_txn_in_ledger",
"4"},
1158 {
"maximum_txn_in_ledger",
"5"} }));
1160 auto alice =
Account(
"alice");
1167 for (
int i = 0; i < 10; ++i)
1180 { {
"minimum_txn_in_ledger",
"200"},
1181 {
"minimum_txn_in_ledger_standalone",
"200"},
1182 {
"target_txn_in_ledger",
"4"},
1183 {
"maximum_txn_in_ledger",
"5"} }));
1189 BEAST_EXPECT(e.
what() ==
1190 "The minimum number of low-fee transactions allowed "
1191 "per ledger (minimum_txn_in_ledger) exceeds "
1192 "the maximum number of low-fee transactions allowed per "
1193 "ledger (maximum_txn_in_ledger)."s
1199 { {
"minimum_txn_in_ledger",
"200"},
1200 {
"minimum_txn_in_ledger_standalone",
"2"},
1201 {
"target_txn_in_ledger",
"4"},
1202 {
"maximum_txn_in_ledger",
"5"} }));
1208 BEAST_EXPECT(e.
what() ==
1209 "The minimum number of low-fee transactions allowed "
1210 "per ledger (minimum_txn_in_ledger) exceeds "
1211 "the maximum number of low-fee transactions allowed per "
1212 "ledger (maximum_txn_in_ledger)."s
1218 { {
"minimum_txn_in_ledger",
"2"},
1219 {
"minimum_txn_in_ledger_standalone",
"200"},
1220 {
"target_txn_in_ledger",
"4"},
1221 {
"maximum_txn_in_ledger",
"5"} }));
1227 BEAST_EXPECT(e.
what() ==
1228 "The minimum number of low-fee transactions allowed "
1229 "per ledger (minimum_txn_in_ledger_standalone) exceeds "
1230 "the maximum number of low-fee transactions allowed per "
1231 "ledger (maximum_txn_in_ledger)."s
1238 using namespace jtx;
1243 {{
"minimum_txn_in_ledger_standalone",
"3"}},
1244 {{
"account_reserve",
"200"}, {
"owner_reserve",
"50"}}));
1246 auto alice =
Account(
"alice");
1252 auto const initQueueMax =
initFee(env, 3, 2, 10, 10, 200, 50);
1254 BEAST_EXPECT(env.
current()->fees().base == 10);
1261 auto USD = bob[
"USD"];
1275 auto aliceSeq = env.
seq(alice);
1276 env(
noop(alice),
seq(aliceSeq++), queued);
1277 env(
noop(alice),
seq(aliceSeq++), queued);
1278 env(
noop(alice),
seq(aliceSeq++), queued);
1280 seq(aliceSeq), queued);
1315 for (
int i = 0; i < 9; ++i)
1329 using namespace jtx;
1332 makeConfig({ {
"minimum_txn_in_ledger_standalone",
"3" } }));
1334 auto alice =
Account(
"alice");
1336 auto charlie =
Account(
"charlie");
1337 auto daria =
Account(
"daria");
1341 BEAST_EXPECT(env.
current()->fees().base == 10);
1353 env(
regkey(alice, charlie));
1357 auto aliceSeq = env.
seq(alice);
1358 env(
noop(alice), queued);
1359 env(
noop(alice),
seq(aliceSeq + 1), queued);
1360 env(
noop(alice),
seq(aliceSeq + 2), queued);
1367 env(
signers(alice, 2, { {bob}, {charlie}, {daria} }),
fee(20),
1370 env(
signers(alice, 2, { { bob },{ charlie },{ daria } }),
fee(20),
1371 seq(aliceSeq + 2), queued);
1379 env(
noop(bob), queued);
1382 env(
noop(alice),
fee(14), queued);
1385 env(
noop(alice),
seq(aliceSeq + 2),
fee(40), queued);
1388 env(
noop(alice),
seq(aliceSeq + 3), queued);
1393 using namespace jtx;
1394 testcase(
"In-flight balance checks");
1397 makeConfig({ {
"minimum_txn_in_ledger_standalone",
"3" } },
1398 {{
"account_reserve",
"200"}, {
"owner_reserve",
"50"}}));
1400 auto alice =
Account(
"alice");
1401 auto charlie =
Account(
"charlie");
1412 auto const initQueueMax =
initFee(env, 3, 2, 10, 10, 200, 50);
1419 checkMetrics(env, 0, initQueueMax, limit + 1, limit, 256);
1421 auto USD = gw[
"USD"];
1422 auto BUX = gw[
"BUX"];
1426 auto aliceSeq = env.
seq(alice);
1427 auto aliceBal = env.
balance(alice);
1434 env(
offer(alice, BUX(5000),
XRP(50000)),
1436 checkMetrics(env, 1, initQueueMax, limit + 1, limit, 256);
1440 env(
noop(alice),
seq(aliceSeq + 1), queued);
1441 checkMetrics(env, 2, initQueueMax, limit + 1, limit, 256);
1458 checkMetrics(env, 0, limit * 2, limit + 1, limit, 256);
1459 aliceSeq = env.
seq(alice);
1460 aliceBal = env.
balance(alice);
1467 checkMetrics(env, 1, limit * 2, limit + 1, limit, 256);
1472 checkMetrics(env, 2, limit * 2, limit + 1, limit, 256);
1478 checkMetrics(env, 2, limit * 2, limit + 1, limit, 256);
1495 checkMetrics(env, 0, limit * 2, limit + 1, limit, 256);
1496 aliceSeq = env.
seq(alice);
1497 aliceBal = env.
balance(alice);
1505 checkMetrics(env, 1, limit * 2, limit + 1, limit, 256);
1511 checkMetrics(env, 1, limit * 2, limit + 1, limit, 256);
1528 checkMetrics(env, 0, limit * 2, limit + 1, limit, 256);
1529 aliceSeq = env.
seq(alice);
1530 aliceBal = env.
balance(alice);
1534 env(
offer(alice, BUX(50),
XRP(500)),
1538 env(
noop(alice),
seq(aliceSeq + 1), queued);
1539 checkMetrics(env, 2, limit * 2, limit + 1, limit, 256);
1556 checkMetrics(env, 0, limit * 2, limit + 1, limit, 256);
1558 aliceSeq = env.
seq(alice);
1559 aliceBal = env.
balance(alice);
1564 env(
pay(alice, charlie,
XRP(50000)),
1569 env(
noop(alice),
seq(aliceSeq + 1), queued);
1570 checkMetrics(env, 2, limit * 2, limit + 1, limit, 256);
1585 checkMetrics(env, 0, limit * 2, limit + 1, limit, 256);
1587 aliceSeq = env.
seq(alice);
1588 aliceBal = env.
balance(alice);
1592 env(
pay(alice, charlie,
XRP(500)),
1596 env(
noop(alice),
seq(aliceSeq + 1), queued);
1597 checkMetrics(env, 2, limit * 2, limit + 1, limit, 256);
1609 auto const amount = USD(500000);
1610 env(
trust(alice, USD(50000000)));
1611 env(
trust(charlie, USD(50000000)));
1617 env(
pay(gw, alice, amount));
1624 checkMetrics(env, 0, limit * 2, limit + 1, limit, 256);
1626 aliceSeq = env.
seq(alice);
1627 aliceBal = env.
balance(alice);
1628 auto aliceUSD = env.
balance(alice, USD);
1632 env(
pay(alice, charlie, amount),
1637 env(
noop(alice),
seq(aliceSeq + 1), queued);
1638 checkMetrics(env, 2, limit * 2, limit + 1, limit, 256);
1655 env(
offer(gw,
XRP(500000), USD(50000)));
1661 checkMetrics(env, 0, limit * 2, limit + 1, limit, 256);
1663 aliceSeq = env.
seq(alice);
1664 aliceBal = env.
balance(alice);
1665 auto charlieUSD = env.
balance(charlie, USD);
1671 BEAST_EXPECT(
XRP(60000) > aliceBal);
1672 env(
pay(alice, charlie, USD(1000)),
1677 env(
noop(alice),
seq(aliceSeq + 1), queued);
1678 checkMetrics(env, 2, limit * 2, limit + 1, limit, 256);
1688 balance(charlie, charlieUSD + USD(1000)),
1696 checkMetrics(env, 0, limit * 2, limit + 1, limit, 256);
1698 aliceSeq = env.
seq(alice);
1699 aliceBal = env.
balance(alice);
1700 charlieUSD = env.
balance(charlie, USD);
1706 BEAST_EXPECT(aliceBal >
XRP(6001));
1707 env(
pay(alice, charlie, USD(500)),
1711 env(
noop(alice),
seq(aliceSeq + 1), queued);
1712 checkMetrics(env, 2, limit * 2, limit + 1, limit, 256);
1722 balance(charlie, charlieUSD + USD(500)),
1732 checkMetrics(env, 0, limit * 2, limit + 1, limit, 256);
1734 aliceSeq = env.
seq(alice);
1735 aliceBal = env.
balance(alice);
1736 BEAST_EXPECT(aliceBal ==
drops(30));
1742 checkMetrics(env, 1, limit * 2, limit + 1, limit, 256);
1753 using namespace jtx;
1756 auto const alice =
Account(
"alice");
1762 cancelOffer[jss::Account] = alice.human();
1763 cancelOffer[jss::OfferSequence] = 3;
1764 cancelOffer[jss::TransactionType] = jss::OfferCancel;
1765 auto const jtx = env.
jt(cancelOffer,
1772 BEAST_EXPECT(conseq.fee ==
drops(10));
1773 BEAST_EXPECT(conseq.potentialSpend ==
XRP(0));
1777 auto USD = alice[
"USD"];
1779 auto const jtx = env.
jt(
trust(
"carol", USD(50000000)),
1786 BEAST_EXPECT(conseq.fee ==
drops(10));
1787 BEAST_EXPECT(conseq.potentialSpend ==
XRP(0));
1791 auto const jtx = env.
jt(ticket::create(alice,
"bob", 60),
1798 BEAST_EXPECT(conseq.fee ==
drops(10));
1799 BEAST_EXPECT(conseq.potentialSpend ==
XRP(0));
1804 cancelTicket[jss::Account] = alice.human();
1806 cancelTicket[jss::TransactionType] = jss::TicketCancel;
1807 auto const jtx = env.
jt(cancelTicket,
1814 BEAST_EXPECT(conseq.fee ==
drops(10));
1815 BEAST_EXPECT(conseq.potentialSpend ==
XRP(0));
1821 using namespace jtx;
1824 auto fee = env.
rpc(
"fee");
1826 if (BEAST_EXPECT(
fee.isMember(jss::result)) &&
1829 auto const& result =
fee[jss::result];
1830 BEAST_EXPECT(result.isMember(jss::ledger_current_index)
1831 && result[jss::ledger_current_index] == 3);
1832 BEAST_EXPECT(result.isMember(jss::current_ledger_size));
1833 BEAST_EXPECT(result.isMember(jss::current_queue_size));
1834 BEAST_EXPECT(result.isMember(jss::expected_ledger_size));
1835 BEAST_EXPECT(!result.isMember(jss::max_queue_size));
1836 BEAST_EXPECT(result.isMember(jss::drops));
1837 auto const&
drops = result[jss::drops];
1838 BEAST_EXPECT(
drops.isMember(jss::base_fee));
1839 BEAST_EXPECT(
drops.isMember(jss::median_fee));
1840 BEAST_EXPECT(
drops.isMember(jss::minimum_fee));
1841 BEAST_EXPECT(
drops.isMember(jss::open_ledger_fee));
1842 BEAST_EXPECT(result.isMember(jss::levels));
1843 auto const& levels = result[jss::levels];
1844 BEAST_EXPECT(levels.isMember(jss::median_level));
1845 BEAST_EXPECT(levels.isMember(jss::minimum_level));
1846 BEAST_EXPECT(levels.isMember(jss::open_ledger_level));
1847 BEAST_EXPECT(levels.isMember(jss::reference_level));
1854 if (BEAST_EXPECT(
fee.isMember(jss::result)) &&
1857 auto const& result =
fee[jss::result];
1858 BEAST_EXPECT(result.isMember(jss::ledger_current_index)
1859 && result[jss::ledger_current_index] == 4);
1860 BEAST_EXPECT(result.isMember(jss::current_ledger_size));
1861 BEAST_EXPECT(result.isMember(jss::current_queue_size));
1862 BEAST_EXPECT(result.isMember(jss::expected_ledger_size));
1863 BEAST_EXPECT(result.isMember(jss::max_queue_size));
1864 auto const&
drops = result[jss::drops];
1865 BEAST_EXPECT(
drops.isMember(jss::base_fee));
1866 BEAST_EXPECT(
drops.isMember(jss::median_fee));
1867 BEAST_EXPECT(
drops.isMember(jss::minimum_fee));
1868 BEAST_EXPECT(
drops.isMember(jss::open_ledger_fee));
1869 BEAST_EXPECT(result.isMember(jss::levels));
1870 auto const& levels = result[jss::levels];
1871 BEAST_EXPECT(levels.isMember(jss::median_level));
1872 BEAST_EXPECT(levels.isMember(jss::minimum_level));
1873 BEAST_EXPECT(levels.isMember(jss::open_ledger_level));
1874 BEAST_EXPECT(levels.isMember(jss::reference_level));
1891 using namespace jtx;
1893 Env env(*
this,
makeConfig({ {
"minimum_txn_in_ledger_standalone",
"1" },
1894 {
"ledgers_in_queue",
"10"}, {
"maximum_txn_per_account",
"20"} }));
1897 auto const alice =
Account(
"alice");
1898 auto const bob =
Account(
"bob");
1903 auto const aliceSeq = env.
seq(alice);
1904 BEAST_EXPECT(env.
current()->info().seq == 3);
1910 auto const bobSeq = env.
seq(bob);
1914 for (
int i = 0; i < 3 + 4 + 5; ++i)
1918 checkMetrics(env, 4 + 3 + 4 + 5, boost::none, 2, 1, 256);
1961 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 4);
1966 testcase(
"Autofilled sequence should account for TxQ");
1967 using namespace jtx;
1969 makeConfig({ {
"minimum_txn_in_ledger_standalone",
"6"} }));
1973 auto const alice =
Account(
"alice");
1974 auto const bob =
Account(
"bob");
1975 env.
fund(
XRP(100000), alice, bob);
1981 auto const aliceSeq = env.
seq(alice);
1982 auto const lastLedgerSeq = env.
current()->info().seq + 2;
1985 for (
int i = 0; i < 5; ++i)
1989 json(jss::LastLedgerSequence, lastLedgerSeq),
1997 auto aliceStat = txQ.getAccountTxs(alice.id(), *env.
current());
1998 auto seq = aliceSeq;
1999 BEAST_EXPECT(aliceStat.size() == 5);
2000 for (
auto const& tx : aliceStat)
2002 BEAST_EXPECT(tx.first ==
seq);
2003 BEAST_EXPECT(tx.second.feeLevel ==
FeeLevel64{ 25600 });
2004 if(
seq == aliceSeq + 2)
2006 BEAST_EXPECT(tx.second.lastValid &&
2007 *tx.second.lastValid == lastLedgerSeq);
2011 BEAST_EXPECT(!tx.second.lastValid);
2018 for (
int i = 0; i < 8; ++i)
2027 for(
int i = 0; i < 9; ++i)
2034 for (
int i = 0; i < 10; ++i)
2041 auto bobStat = txQ.getAccountTxs(bob.id(), *env.
current());
2042 BEAST_EXPECT(bobStat.empty());
2047 auto aliceStat = txQ.getAccountTxs(alice.id(), *env.
current());
2048 auto seq = aliceSeq;
2049 BEAST_EXPECT(aliceStat.size() == 4);
2050 for (
auto const& tx : aliceStat)
2053 if (
seq == aliceSeq + 2)
2056 BEAST_EXPECT(tx.first ==
seq);
2057 BEAST_EXPECT(tx.second.feeLevel ==
FeeLevel64{ 25600 });
2058 BEAST_EXPECT(!tx.second.lastValid);
2066 auto aliceStat = txQ.getAccountTxs(alice.id(), *env.
current());
2067 auto seq = aliceSeq;
2068 BEAST_EXPECT(aliceStat.size() == 5);
2069 for (
auto const& tx : aliceStat)
2071 BEAST_EXPECT(tx.first ==
seq);
2072 BEAST_EXPECT(tx.second.feeLevel ==
FeeLevel64{ 25600 });
2073 BEAST_EXPECT(!tx.second.lastValid);
2082 auto bobStat = txQ.getAccountTxs(bob.id(), *env.
current());
2083 BEAST_EXPECT(bobStat.empty());
2086 auto aliceStat = txQ.getAccountTxs(alice.id(), *env.
current());
2087 BEAST_EXPECT(aliceStat.empty());
2093 using namespace jtx;
2095 makeConfig({ {
"minimum_txn_in_ledger_standalone",
"3" } }));
2098 Account const alice{
"alice" };
2099 env.
fund(
XRP(1000000), alice);
2102 auto const withQueue =
2103 R
"({ "account": ")" + alice.human() +
2104 R"(", "queue": true })";
2105 auto const withoutQueue =
2106 R
"({ "account": ")" + alice.human() +
2108 auto const prevLedgerWithQueue =
2109 R
"({ "account": ")" + alice.human() +
2110 R"(", "queue": true, "ledger_index": 3 })";
2111 BEAST_EXPECT(env.current()->info().seq > 3);
2115 auto const info = env.
rpc(
"json",
"account_info", withoutQueue);
2116 BEAST_EXPECT(info.isMember(jss::result) &&
2117 info[jss::result].isMember(jss::account_data));
2118 BEAST_EXPECT(!info[jss::result].isMember(jss::queue_data));
2122 auto const info = env.
rpc(
"json",
"account_info", withQueue);
2123 BEAST_EXPECT(info.isMember(jss::result) &&
2124 info[jss::result].isMember(jss::account_data));
2125 auto const& result = info[jss::result];
2126 BEAST_EXPECT(result.isMember(jss::queue_data));
2127 auto const& queue_data = result[jss::queue_data];
2128 BEAST_EXPECT(queue_data.isObject());
2129 BEAST_EXPECT(queue_data.isMember(jss::txn_count));
2130 BEAST_EXPECT(queue_data[jss::txn_count] == 0);
2131 BEAST_EXPECT(!queue_data.isMember(jss::lowest_sequence));
2132 BEAST_EXPECT(!queue_data.isMember(jss::highest_sequence));
2133 BEAST_EXPECT(!queue_data.isMember(jss::auth_change_queued));
2134 BEAST_EXPECT(!queue_data.isMember(jss::max_spend_drops_total));
2135 BEAST_EXPECT(!queue_data.isMember(jss::transactions));
2143 auto const info = env.
rpc(
"json",
"account_info", withQueue);
2144 BEAST_EXPECT(info.isMember(jss::result) &&
2145 info[jss::result].isMember(jss::account_data));
2146 auto const& result = info[jss::result];
2147 BEAST_EXPECT(result.isMember(jss::queue_data));
2148 auto const& queue_data = result[jss::queue_data];
2149 BEAST_EXPECT(queue_data.isObject());
2150 BEAST_EXPECT(queue_data.isMember(jss::txn_count));
2151 BEAST_EXPECT(queue_data[jss::txn_count] == 0);
2152 BEAST_EXPECT(!queue_data.isMember(jss::lowest_sequence));
2153 BEAST_EXPECT(!queue_data.isMember(jss::highest_sequence));
2154 BEAST_EXPECT(!queue_data.isMember(jss::auth_change_queued));
2155 BEAST_EXPECT(!queue_data.isMember(jss::max_spend_drops_total));
2156 BEAST_EXPECT(!queue_data.isMember(jss::transactions));
2167 auto const info = env.
rpc(
"json",
"account_info", withQueue);
2168 BEAST_EXPECT(info.isMember(jss::result) &&
2169 info[jss::result].isMember(jss::account_data));
2170 auto const& result = info[jss::result];
2171 auto const& data = result[jss::account_data];
2172 BEAST_EXPECT(result.isMember(jss::queue_data));
2173 auto const& queue_data = result[jss::queue_data];
2174 BEAST_EXPECT(queue_data.isObject());
2175 BEAST_EXPECT(queue_data.isMember(jss::txn_count));
2176 BEAST_EXPECT(queue_data[jss::txn_count] == 4);
2177 BEAST_EXPECT(queue_data.isMember(jss::lowest_sequence));
2178 BEAST_EXPECT(queue_data[jss::lowest_sequence] == data[jss::Sequence]);
2179 BEAST_EXPECT(queue_data.isMember(jss::highest_sequence));
2180 BEAST_EXPECT(queue_data[jss::highest_sequence] ==
2181 data[jss::Sequence].asUInt() +
2182 queue_data[jss::txn_count].asUInt() - 1);
2183 BEAST_EXPECT(!queue_data.isMember(jss::auth_change_queued));
2184 BEAST_EXPECT(!queue_data.isMember(jss::max_spend_drops_total));
2185 BEAST_EXPECT(queue_data.isMember(jss::transactions));
2186 auto const& queued = queue_data[jss::transactions];
2187 BEAST_EXPECT(queued.size() == queue_data[jss::txn_count]);
2188 for (
unsigned i = 0; i < queued.size(); ++i)
2190 auto const& item = queued[i];
2191 BEAST_EXPECT(item[jss::seq] == data[jss::Sequence].asInt() + i);
2192 BEAST_EXPECT(item[jss::fee_level] ==
"2560");
2193 BEAST_EXPECT(!item.isMember(jss::LastLedgerSequence));
2195 if (i == queued.size() - 1)
2197 BEAST_EXPECT(!item.isMember(jss::fee));
2198 BEAST_EXPECT(!item.isMember(jss::max_spend_drops));
2199 BEAST_EXPECT(!item.isMember(jss::auth_change));
2203 BEAST_EXPECT(item.isMember(jss::fee));
2204 BEAST_EXPECT(item[jss::fee] ==
"100");
2205 BEAST_EXPECT(item.isMember(jss::max_spend_drops));
2206 BEAST_EXPECT(item[jss::max_spend_drops] ==
"100");
2207 BEAST_EXPECT(item.isMember(jss::auth_change));
2208 BEAST_EXPECT(!item[jss::auth_change].asBool());
2216 json(jss::LastLedgerSequence, 10),
2221 auto const info = env.
rpc(
"json",
"account_info", withQueue);
2222 BEAST_EXPECT(info.isMember(jss::result) &&
2223 info[jss::result].isMember(jss::account_data));
2224 auto const& result = info[jss::result];
2225 auto const& data = result[jss::account_data];
2226 BEAST_EXPECT(result.isMember(jss::queue_data));
2227 auto const& queue_data = result[jss::queue_data];
2228 BEAST_EXPECT(queue_data.isObject());
2229 BEAST_EXPECT(queue_data.isMember(jss::txn_count));
2230 BEAST_EXPECT(queue_data[jss::txn_count] == 5);
2231 BEAST_EXPECT(queue_data.isMember(jss::lowest_sequence));
2232 BEAST_EXPECT(queue_data[jss::lowest_sequence] == data[jss::Sequence]);
2233 BEAST_EXPECT(queue_data.isMember(jss::highest_sequence));
2234 BEAST_EXPECT(queue_data[jss::highest_sequence] ==
2235 data[jss::Sequence].asUInt() +
2236 queue_data[jss::txn_count].asUInt() - 1);
2237 BEAST_EXPECT(!queue_data.isMember(jss::auth_change_queued));
2238 BEAST_EXPECT(!queue_data.isMember(jss::max_spend_drops_total));
2239 BEAST_EXPECT(queue_data.isMember(jss::transactions));
2240 auto const& queued = queue_data[jss::transactions];
2241 BEAST_EXPECT(queued.size() == queue_data[jss::txn_count]);
2242 for (
unsigned i = 0; i < queued.size(); ++i)
2244 auto const& item = queued[i];
2245 BEAST_EXPECT(item[jss::seq] == data[jss::Sequence].asInt() + i);
2246 BEAST_EXPECT(item[jss::fee_level] ==
"2560");
2248 if (i == queued.size() - 1)
2250 BEAST_EXPECT(!item.isMember(jss::fee));
2251 BEAST_EXPECT(!item.isMember(jss::max_spend_drops));
2252 BEAST_EXPECT(!item.isMember(jss::auth_change));
2253 BEAST_EXPECT(item.isMember(jss::LastLedgerSequence));
2254 BEAST_EXPECT(item[jss::LastLedgerSequence] == 10);
2258 BEAST_EXPECT(item.isMember(jss::fee));
2259 BEAST_EXPECT(item[jss::fee] ==
"100");
2260 BEAST_EXPECT(item.isMember(jss::max_spend_drops));
2261 BEAST_EXPECT(item[jss::max_spend_drops] ==
"100");
2262 BEAST_EXPECT(item.isMember(jss::auth_change));
2263 BEAST_EXPECT(!item[jss::auth_change].asBool());
2264 BEAST_EXPECT(!item.isMember(jss::LastLedgerSequence));
2274 auto const info = env.
rpc(
"json",
"account_info", withQueue);
2275 BEAST_EXPECT(info.isMember(jss::result) &&
2276 info[jss::result].isMember(jss::account_data));
2277 auto const& result = info[jss::result];
2278 auto const& data = result[jss::account_data];
2279 BEAST_EXPECT(result.isMember(jss::queue_data));
2280 auto const& queue_data = result[jss::queue_data];
2281 BEAST_EXPECT(queue_data.isObject());
2282 BEAST_EXPECT(queue_data.isMember(jss::txn_count));
2283 BEAST_EXPECT(queue_data[jss::txn_count] == 5);
2284 BEAST_EXPECT(queue_data.isMember(jss::lowest_sequence));
2285 BEAST_EXPECT(queue_data[jss::lowest_sequence] == data[jss::Sequence]);
2286 BEAST_EXPECT(queue_data.isMember(jss::highest_sequence));
2287 BEAST_EXPECT(queue_data[jss::highest_sequence] ==
2288 data[jss::Sequence].asUInt() +
2289 queue_data[jss::txn_count].asUInt() - 1);
2290 BEAST_EXPECT(queue_data.isMember(jss::auth_change_queued));
2291 BEAST_EXPECT(queue_data[jss::auth_change_queued].asBool());
2292 BEAST_EXPECT(queue_data.isMember(jss::max_spend_drops_total));
2293 BEAST_EXPECT(queue_data[jss::max_spend_drops_total] ==
"500");
2294 BEAST_EXPECT(queue_data.isMember(jss::transactions));
2295 auto const& queued = queue_data[jss::transactions];
2296 BEAST_EXPECT(queued.size() == queue_data[jss::txn_count]);
2297 for (
unsigned i = 0; i < queued.size(); ++i)
2299 auto const& item = queued[i];
2300 BEAST_EXPECT(item[jss::seq] == data[jss::Sequence].asInt() + i);
2301 BEAST_EXPECT(item[jss::fee_level] ==
"2560");
2303 if (i == queued.size() - 1)
2305 BEAST_EXPECT(item.isMember(jss::fee));
2306 BEAST_EXPECT(item[jss::fee] ==
"100");
2307 BEAST_EXPECT(item.isMember(jss::max_spend_drops));
2308 BEAST_EXPECT(item[jss::max_spend_drops] ==
"100");
2309 BEAST_EXPECT(item.isMember(jss::auth_change));
2310 BEAST_EXPECT(item[jss::auth_change].asBool());
2311 BEAST_EXPECT(item.isMember(jss::LastLedgerSequence));
2312 BEAST_EXPECT(item[jss::LastLedgerSequence] == 10);
2316 BEAST_EXPECT(item.isMember(jss::fee));
2317 BEAST_EXPECT(item[jss::fee] ==
"100");
2318 BEAST_EXPECT(item.isMember(jss::max_spend_drops));
2319 BEAST_EXPECT(item[jss::max_spend_drops] ==
"100");
2320 BEAST_EXPECT(item.isMember(jss::auth_change));
2321 BEAST_EXPECT(!item[jss::auth_change].asBool());
2322 BEAST_EXPECT(!item.isMember(jss::LastLedgerSequence));
2329 auto const info = env.
rpc(
"json",
"account_info", prevLedgerWithQueue);
2330 BEAST_EXPECT(info.isMember(jss::result) &&
2340 auto const info = env.
rpc(
"json",
"account_info", withQueue);
2341 BEAST_EXPECT(info.isMember(jss::result) &&
2342 info[jss::result].isMember(jss::account_data));
2343 auto const& result = info[jss::result];
2344 BEAST_EXPECT(result.isMember(jss::queue_data));
2345 auto const& queue_data = result[jss::queue_data];
2346 BEAST_EXPECT(queue_data.isObject());
2347 BEAST_EXPECT(queue_data.isMember(jss::txn_count));
2348 BEAST_EXPECT(queue_data[jss::txn_count] == 0);
2349 BEAST_EXPECT(!queue_data.isMember(jss::lowest_sequence));
2350 BEAST_EXPECT(!queue_data.isMember(jss::highest_sequence));
2351 BEAST_EXPECT(!queue_data.isMember(jss::auth_change_queued));
2352 BEAST_EXPECT(!queue_data.isMember(jss::max_spend_drops_total));
2353 BEAST_EXPECT(!queue_data.isMember(jss::transactions));
2359 using namespace jtx;
2361 makeConfig({ {
"minimum_txn_in_ledger_standalone",
"3" } }));
2364 Account const alice{
"alice" };
2365 env.
fund(
XRP(1000000), alice);
2369 auto const server_info = env.
rpc(
"server_info");
2370 BEAST_EXPECT(server_info.isMember(jss::result) &&
2371 server_info[jss::result].isMember(jss::info));
2372 auto const& info = server_info[jss::result][jss::info];
2373 BEAST_EXPECT(info.isMember(jss::load_factor) &&
2374 info[jss::load_factor] == 1);
2375 BEAST_EXPECT(!info.isMember(jss::load_factor_server));
2376 BEAST_EXPECT(!info.isMember(jss::load_factor_local));
2377 BEAST_EXPECT(!info.isMember(jss::load_factor_net));
2378 BEAST_EXPECT(!info.isMember(jss::load_factor_fee_escalation));
2381 auto const server_state = env.
rpc(
"server_state");
2382 auto const& state = server_state[jss::result][jss::state];
2383 BEAST_EXPECT(state.isMember(jss::load_factor) &&
2384 state[jss::load_factor] == 256);
2385 BEAST_EXPECT(state.isMember(jss::load_base) &&
2386 state[jss::load_base] == 256);
2387 BEAST_EXPECT(state.isMember(jss::load_factor_server) &&
2388 state[jss::load_factor_server] == 256);
2389 BEAST_EXPECT(state.isMember(jss::load_factor_fee_escalation) &&
2390 state[jss::load_factor_fee_escalation] == 256);
2391 BEAST_EXPECT(state.isMember(jss::load_factor_fee_queue) &&
2392 state[jss::load_factor_fee_queue] == 256);
2393 BEAST_EXPECT(state.isMember(jss::load_factor_fee_reference) &&
2394 state[jss::load_factor_fee_reference] == 256);
2402 auto aliceSeq = env.
seq(alice);
2404 for (
auto i = 0; i < 4; ++i)
2405 envs(
noop(alice),
fee(100),
seq(aliceSeq + i),
2410 auto const server_info = env.
rpc(
"server_info");
2411 BEAST_EXPECT(server_info.isMember(jss::result) &&
2412 server_info[jss::result].isMember(jss::info));
2413 auto const& info = server_info[jss::result][jss::info];
2415 BEAST_EXPECT(info.isMember(jss::load_factor) &&
2416 info[jss::load_factor] > 888.88 &&
2417 info[jss::load_factor] < 888.89);
2418 BEAST_EXPECT(info.isMember(jss::load_factor_server) &&
2419 info[jss::load_factor_server] == 1);
2420 BEAST_EXPECT(!info.isMember(jss::load_factor_local));
2421 BEAST_EXPECT(!info.isMember(jss::load_factor_net));
2422 BEAST_EXPECT(info.isMember(jss::load_factor_fee_escalation) &&
2423 info[jss::load_factor_fee_escalation] > 888.88 &&
2424 info[jss::load_factor_fee_escalation] < 888.89);
2427 auto const server_state = env.
rpc(
"server_state");
2428 auto const& state = server_state[jss::result][jss::state];
2429 BEAST_EXPECT(state.isMember(jss::load_factor) &&
2430 state[jss::load_factor] == 227555);
2431 BEAST_EXPECT(state.isMember(jss::load_base) &&
2432 state[jss::load_base] == 256);
2433 BEAST_EXPECT(state.isMember(jss::load_factor_server) &&
2434 state[jss::load_factor_server] == 256);
2435 BEAST_EXPECT(state.isMember(jss::load_factor_fee_escalation) &&
2436 state[jss::load_factor_fee_escalation] == 227555);
2437 BEAST_EXPECT(state.isMember(jss::load_factor_fee_queue) &&
2438 state[jss::load_factor_fee_queue] == 256);
2439 BEAST_EXPECT(state.isMember(jss::load_factor_fee_reference) &&
2440 state[jss::load_factor_fee_reference] == 256);
2446 auto const server_info = env.
rpc(
"server_info");
2447 BEAST_EXPECT(server_info.isMember(jss::result) &&
2448 server_info[jss::result].isMember(jss::info));
2449 auto const& info = server_info[jss::result][jss::info];
2451 BEAST_EXPECT(info.isMember(jss::load_factor) &&
2452 info[jss::load_factor] == 1000);
2453 BEAST_EXPECT(!info.isMember(jss::load_factor_server));
2454 BEAST_EXPECT(!info.isMember(jss::load_factor_local));
2455 BEAST_EXPECT(info.isMember(jss::load_factor_net) &&
2456 info[jss::load_factor_net] == 1000);
2457 BEAST_EXPECT(info.isMember(jss::load_factor_fee_escalation) &&
2458 info[jss::load_factor_fee_escalation] > 888.88 &&
2459 info[jss::load_factor_fee_escalation] < 888.89);
2462 auto const server_state = env.
rpc(
"server_state");
2463 auto const& state = server_state[jss::result][jss::state];
2464 BEAST_EXPECT(state.isMember(jss::load_factor) &&
2465 state[jss::load_factor] == 256000);
2466 BEAST_EXPECT(state.isMember(jss::load_base) &&
2467 state[jss::load_base] == 256);
2468 BEAST_EXPECT(state.isMember(jss::load_factor_server) &&
2469 state[jss::load_factor_server] == 256000);
2470 BEAST_EXPECT(state.isMember(jss::load_factor_fee_escalation) &&
2471 state[jss::load_factor_fee_escalation] == 227555);
2472 BEAST_EXPECT(state.isMember(jss::load_factor_fee_queue) &&
2473 state[jss::load_factor_fee_queue] == 256);
2474 BEAST_EXPECT(state.isMember(jss::load_factor_fee_reference) &&
2475 state[jss::load_factor_fee_reference] == 256);
2481 for (
int i = 0; i < 5; ++i)
2486 auto const server_info = env.
rpc(
"server_info");
2487 BEAST_EXPECT(server_info.isMember(jss::result) &&
2488 server_info[jss::result].isMember(jss::info));
2489 auto const& info = server_info[jss::result][jss::info];
2491 BEAST_EXPECT(info.isMember(jss::load_factor) &&
2492 info[jss::load_factor] > 888.88 &&
2493 info[jss::load_factor] < 888.89);
2497 BEAST_EXPECT(info.isMember(jss::load_factor_server) &&
2498 info[jss::load_factor_server] > 1.245 &&
2499 info[jss::load_factor_server] < 2.4415);
2500 BEAST_EXPECT(info.isMember(jss::load_factor_local) &&
2501 info[jss::load_factor_local] > 1.245 &&
2502 info[jss::load_factor_local] < 2.4415);
2503 BEAST_EXPECT(!info.isMember(jss::load_factor_net));
2504 BEAST_EXPECT(info.isMember(jss::load_factor_fee_escalation) &&
2505 info[jss::load_factor_fee_escalation] > 888.88 &&
2506 info[jss::load_factor_fee_escalation] < 888.89);
2509 auto const server_state = env.
rpc(
"server_state");
2510 auto const& state = server_state[jss::result][jss::state];
2511 BEAST_EXPECT(state.isMember(jss::load_factor) &&
2512 state[jss::load_factor] == 227555);
2513 BEAST_EXPECT(state.isMember(jss::load_base) &&
2514 state[jss::load_base] == 256);
2518 BEAST_EXPECT(state.isMember(jss::load_factor_server) &&
2519 state[jss::load_factor_server] >= 320 &&
2520 state[jss::load_factor_server] <= 625);
2521 BEAST_EXPECT(state.isMember(jss::load_factor_fee_escalation) &&
2522 state[jss::load_factor_fee_escalation] == 227555);
2523 BEAST_EXPECT(state.isMember(jss::load_factor_fee_queue) &&
2524 state[jss::load_factor_fee_queue] == 256);
2525 BEAST_EXPECT(state.isMember(jss::load_factor_fee_reference) &&
2526 state[jss::load_factor_fee_reference] == 256);
2532 auto const server_info = env.
rpc(
"server_info");
2533 BEAST_EXPECT(server_info.isMember(jss::result) &&
2534 server_info[jss::result].isMember(jss::info));
2535 auto const& info = server_info[jss::result][jss::info];
2541 BEAST_EXPECT(info.isMember(jss::load_factor) &&
2542 info[jss::load_factor] > 1.245 &&
2543 info[jss::load_factor] < 2.4415);
2544 BEAST_EXPECT(!info.isMember(jss::load_factor_server));
2545 BEAST_EXPECT(info.isMember(jss::load_factor_local) &&
2546 info[jss::load_factor_local] > 1.245 &&
2547 info[jss::load_factor_local] < 2.4415);
2548 BEAST_EXPECT(!info.isMember(jss::load_factor_net));
2549 BEAST_EXPECT(!info.isMember(jss::load_factor_fee_escalation));
2552 auto const server_state = env.
rpc(
"server_state");
2553 auto const& state = server_state[jss::result][jss::state];
2554 BEAST_EXPECT(state.isMember(jss::load_factor) &&
2555 state[jss::load_factor] >= 320 &&
2556 state[jss::load_factor] <= 625);
2557 BEAST_EXPECT(state.isMember(jss::load_base) &&
2558 state[jss::load_base] == 256);
2562 BEAST_EXPECT(state.isMember(jss::load_factor_server) &&
2563 state[jss::load_factor_server] >= 320 &&
2564 state[jss::load_factor_server] <= 625);
2565 BEAST_EXPECT(state.isMember(jss::load_factor_fee_escalation) &&
2566 state[jss::load_factor_fee_escalation] == 256);
2567 BEAST_EXPECT(state.isMember(jss::load_factor_fee_queue) &&
2568 state[jss::load_factor_fee_queue] == 256);
2569 BEAST_EXPECT(state.isMember(jss::load_factor_fee_reference) &&
2570 state[jss::load_factor_fee_reference] == 256);
2576 using namespace jtx;
2579 makeConfig({ {
"minimum_txn_in_ledger_standalone",
"3" } }));
2583 stream[jss::streams].append(
"server");
2586 auto jv = wsc->invoke(
"subscribe", stream);
2587 BEAST_EXPECT(jv[jss::status] ==
"success");
2590 Account a{
"a"}, b{
"b"}, c{
"c"}, d{
"d"}, e{
"e"}, f{
"f"},
2591 g{
"g"}, h{
"h"}, i{
"i"};
2599 using namespace std::chrono_literals;
2600 BEAST_EXPECT(wsc->findMsg(5s,
2603 return jv[jss::type] ==
"serverStatus" &&
2604 jv.isMember(jss::load_factor) &&
2605 jv[jss::load_factor] == 256 &&
2606 jv.isMember(jss::load_base) &&
2607 jv[jss::load_base] == 256 &&
2608 jv.isMember(jss::load_factor_server) &&
2609 jv[jss::load_factor_server] == 256 &&
2610 jv.isMember(jss::load_factor_fee_escalation) &&
2611 jv[jss::load_factor_fee_escalation] == 256 &&
2612 jv.isMember(jss::load_factor_fee_queue) &&
2613 jv[jss::load_factor_fee_queue] == 256 &&
2614 jv.isMember(jss::load_factor_fee_reference) &&
2615 jv[jss::load_factor_fee_reference] == 256;
2618 BEAST_EXPECT(wsc->findMsg(5s,
2621 return jv[jss::type] ==
"serverStatus" &&
2622 jv.isMember(jss::load_factor) &&
2623 jv[jss::load_factor] == 227555 &&
2624 jv.isMember(jss::load_base) &&
2625 jv[jss::load_base] == 256 &&
2626 jv.isMember(jss::load_factor_server) &&
2627 jv[jss::load_factor_server] == 256 &&
2628 jv.isMember(jss::load_factor_fee_escalation) &&
2629 jv[jss::load_factor_fee_escalation] == 227555 &&
2630 jv.isMember(jss::load_factor_fee_queue) &&
2631 jv[jss::load_factor_fee_queue] == 256 &&
2632 jv.isMember(jss::load_factor_fee_reference) &&
2633 jv[jss::load_factor_fee_reference] == 256;
2639 BEAST_EXPECT(wsc->findMsg(5s,
2642 return jv[jss::type] ==
"serverStatus" &&
2643 jv.isMember(jss::load_factor) &&
2644 jv[jss::load_factor] == 256 &&
2645 jv.isMember(jss::load_base) &&
2646 jv[jss::load_base] == 256 &&
2647 jv.isMember(jss::load_factor_server) &&
2648 jv[jss::load_factor_server] == 256 &&
2649 jv.isMember(jss::load_factor_fee_escalation) &&
2650 jv[jss::load_factor_fee_escalation] == 256 &&
2651 jv.isMember(jss::load_factor_fee_queue) &&
2652 jv[jss::load_factor_fee_queue] == 256 &&
2653 jv.isMember(jss::load_factor_fee_reference) &&
2654 jv[jss::load_factor_fee_reference] == 256;
2664 env(
noop(a),
fee(10), queued);
2665 env(
noop(b),
fee(10), queued);
2666 env(
noop(c),
fee(10), queued);
2667 env(
noop(d),
fee(10), queued);
2668 env(
noop(e),
fee(10), queued);
2669 env(
noop(f),
fee(10), queued);
2670 env(
noop(g),
fee(10), queued);
2674 BEAST_EXPECT(wsc->findMsg(5s,
2677 return jv[jss::type] ==
"serverStatus" &&
2678 jv.isMember(jss::load_factor) &&
2679 jv[jss::load_factor] == 200000 &&
2680 jv.isMember(jss::load_base) &&
2681 jv[jss::load_base] == 256 &&
2682 jv.isMember(jss::load_factor_server) &&
2683 jv[jss::load_factor_server] == 256 &&
2684 jv.isMember(jss::load_factor_fee_escalation) &&
2685 jv[jss::load_factor_fee_escalation] == 200000 &&
2686 jv.isMember(jss::load_factor_fee_queue) &&
2687 jv[jss::load_factor_fee_queue] == 256 &&
2688 jv.isMember(jss::load_factor_fee_reference) &&
2689 jv[jss::load_factor_fee_reference] == 256;
2694 BEAST_EXPECT(wsc->findMsg(5s,
2697 return jv[jss::type] ==
"serverStatus" &&
2698 jv.isMember(jss::load_factor) &&
2699 jv[jss::load_factor] == 184320 &&
2700 jv.isMember(jss::load_base) &&
2701 jv[jss::load_base] == 256 &&
2702 jv.isMember(jss::load_factor_server) &&
2703 jv[jss::load_factor_server] == 256 &&
2704 jv.isMember(jss::load_factor_fee_escalation) &&
2705 jv[jss::load_factor_fee_escalation] == 184320 &&
2706 jv.isMember(jss::load_factor_fee_queue) &&
2707 jv[jss::load_factor_fee_queue] == 256 &&
2708 jv.isMember(jss::load_factor_fee_reference) &&
2709 jv[jss::load_factor_fee_reference] == 256;
2714 BEAST_EXPECT(wsc->findMsg(5s,
2717 return jv[jss::type] ==
"serverStatus" &&
2718 jv.isMember(jss::load_factor) &&
2719 jv[jss::load_factor] == 256 &&
2720 jv.isMember(jss::load_base) &&
2721 jv[jss::load_base] == 256 &&
2722 jv.isMember(jss::load_factor_server) &&
2723 jv[jss::load_factor_server] == 256 &&
2724 jv.isMember(jss::load_factor_fee_escalation) &&
2725 jv[jss::load_factor_fee_escalation] == 256 &&
2726 jv.isMember(jss::load_factor_fee_queue) &&
2727 jv[jss::load_factor_fee_queue] == 256 &&
2728 jv.isMember(jss::load_factor_fee_reference) &&
2729 jv[jss::load_factor_fee_reference] == 256;
2732 BEAST_EXPECT(!wsc->findMsg(1s,
2735 return jv[jss::type] ==
"serverStatus";
2738 auto jv = wsc->invoke(
"unsubscribe", stream);
2739 BEAST_EXPECT(jv[jss::status] ==
"success");
2745 using namespace jtx;
2748 makeConfig({ {
"minimum_txn_in_ledger_standalone",
"3" } }));
2749 auto alice =
Account(
"alice");
2753 env.
fund(
XRP(50000000), alice, bob);
2757 auto calcTotalFee = [&](
2758 std::int64_t alreadyPaid, boost::optional<std::size_t> numToClear = boost::none)
2760 auto totalFactor = 0;
2764 numToClear.emplace(metrics.txCount + 1);
2765 for (
int i = 0; i < *numToClear; ++i)
2768 totalFactor += inLedger * inLedger;
2771 toDrops (metrics.medFeeLevel * totalFactor /
2772 (metrics.txPerLedger * metrics.txPerLedger),
2776 result -= alreadyPaid;
2782 testcase(
"straightfoward positive case");
2785 auto aliceSeq = env.
seq(alice);
2786 for (
int i = 0; i < 2; ++i)
2804 BEAST_EXPECT(totalFee1 == 60911);
2808 env(
noop(alice),
fee(totalFee1),
seq(aliceSeq++),
2815 std::uint64_t const totalFee2 = calcTotalFee (100 * 2 + 8889 +
2817 BEAST_EXPECT(totalFee2 == 35556);
2819 env(
noop(alice),
fee(totalFee2),
seq(aliceSeq++));
2824 testcase(
"replace last tx with enough to clear queue");
2827 auto aliceSeq = env.
seq(alice);
2828 for (
int i = 0; i < 2; ++i)
2846 calcTotalFee (100 * 2, metrics.txCount);
2847 BEAST_EXPECT(totalFee == 167578);
2850 env(
noop(alice),
fee(totalFee),
seq(aliceSeq++));
2859 testcase(
"replace middle tx with enough to clear queue");
2863 auto aliceSeq = env.
seq(alice);
2864 for (
int i = 0; i < 5; ++i)
2873 BEAST_EXPECT(totalFee == 20287);
2876 env(
noop(alice),
fee(totalFee),
seq(aliceSeq++));
2881 BEAST_EXPECT(aliceQueue.size() == 2);
2882 auto seq = aliceSeq;
2883 for (
auto const& tx : aliceQueue)
2885 BEAST_EXPECT(tx.first ==
seq);
2886 BEAST_EXPECT(tx.second.feeLevel ==
FeeLevel64{ 2560 });
2895 testcase(
"clear queue failure (load)");
2899 auto aliceSeq = env.
seq(alice);
2900 for (
int i = 0; i < 2; ++i)
2904 for (
int i = 0; i < 2; ++i)
2913 std::uint64_t const totalFee = calcTotalFee (200 * 2 + 22 * 2);
2914 BEAST_EXPECT(totalFee == 35006);
2918 feeTrack.setRemoteFee(origFee * 5);
2931 feeTrack.setRemoteFee(origFee);
2950 using namespace jtx;
2951 using namespace std::chrono_literals;
2955 makeConfig({ {
"minimum_txn_in_ledger_standalone",
"3" },
2956 {
"normal_consensus_increase_percent",
"25" },
2957 {
"slow_consensus_decrease_percent",
"50" },
2958 {
"target_txn_in_ledger",
"10" },
2959 {
"maximum_txn_per_account",
"200" } }));
2960 auto alice =
Account(
"alice");
2963 env.
fund(
XRP(50000000), alice);
2967 auto seqAlice = env.
seq(alice);
2969 for (
int i = 0; i < txCount; ++i)
3013 env.
close(env.
now() + 5s, 10000ms);
3018 env.
close(env.
now() + 5s, 10000ms);
3023 env.
close(env.
now() + 5s, 10000ms);
3030 env.
close(env.
now() + 5s, 10000ms);
3034 BEAST_EXPECT(!txCount);
3039 makeConfig({ {
"minimum_txn_in_ledger_standalone",
"3" },
3040 {
"normal_consensus_increase_percent",
"150" },
3041 {
"slow_consensus_decrease_percent",
"150" },
3042 {
"target_txn_in_ledger",
"10" },
3043 {
"maximum_txn_per_account",
"200" } }));
3044 auto alice =
Account(
"alice");
3047 env.
fund(
XRP(50000000), alice);
3051 auto seqAlice = env.
seq(alice);
3053 for (
int i = 0; i < txCount; ++i)
3072 env.
close(env.
now() + 5s, 10000ms);
3078 BEAST_EXPECT(!txCount);