36 using namespace test::jtx;
39 char const* COMMAND = jss::tx.c_str();
40 char const* BINARY = jss::binary.c_str();
45 Env env{*
this, features};
46 auto const alice = Account(
"alice");
47 env.fund(XRP(1000), alice);
52 auto const startLegSeq = env.current()->header().seq;
53 for (
int i = 0; i < 750; ++i)
58 metas.
emplace_back(env.closed()->txRead(env.tx()->getTransactionID()).second);
60 auto const endLegSeq = env.closed()->header().seq;
63 for (
size_t i = 0; i < txns.
size(); ++i)
65 auto const& tx = txns[i];
66 auto const& meta = metas[i];
67 auto const result = env.rpc(
70 BEAST_EXPECT(result[jss::result][jss::status] == jss::success);
71 BEAST_EXPECT(result[jss::result][jss::tx] ==
strHex(tx->getSerializer().getData()));
72 BEAST_EXPECT(result[jss::result][jss::meta] ==
strHex(meta->getSerializer().getData()));
75 auto const tx = env.jt(
noop(alice), seq(env.seq(alice))).stx;
76 for (
int deltaEndSeq = 0; deltaEndSeq < 2; ++deltaEndSeq)
78 auto const result = env.rpc(
86 result[jss::result][jss::status] == jss::error && result[jss::result][jss::error] == NOT_FOUND);
89 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
91 BEAST_EXPECT(result[jss::result][jss::searched_all].asBool());
95 for (
auto&& tx : txns)
97 auto const result = env.rpc(
104 BEAST_EXPECT(result[jss::result][jss::status] == jss::success);
105 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
108 auto const deletedLedger = (startLegSeq + endLegSeq) / 2;
112 ->deleteTransactionByLedgerSeq(deletedLedger);
115 for (
int deltaEndSeq = 0; deltaEndSeq < 2; ++deltaEndSeq)
117 auto const result = env.rpc(
125 result[jss::result][jss::status] == jss::error && result[jss::result][jss::error] == NOT_FOUND);
126 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
136 result[jss::result][jss::status] == jss::error && result[jss::result][jss::error] == NOT_FOUND);
138 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
144 auto const result = env.rpc(
148 result[jss::result][jss::status] == jss::error && result[jss::result][jss::error] == NOT_FOUND);
150 BEAST_EXPECT(result[jss::result][jss::searched_all].asBool());
156 auto const result = env.rpc(
159 BEAST_EXPECT(result[jss::result][jss::status] == jss::success);
160 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
165 auto const result = env.rpc(
172 BEAST_EXPECT(result[jss::result][jss::status] == jss::error && result[jss::result][jss::error] ==
INVALID);
174 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
179 auto const result = env.rpc(
182 BEAST_EXPECT(result[jss::result][jss::status] == jss::error && result[jss::result][jss::error] ==
INVALID);
184 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
192 BEAST_EXPECT(result[jss::result][jss::status] == jss::error && result[jss::result][jss::error] ==
INVALID);
194 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
199 auto const result = env.rpc(COMMAND,
to_string(tx->getTransactionID()), BINARY,
to_string(20));
201 BEAST_EXPECT(result[jss::result][jss::status] == jss::error && result[jss::result][jss::error] ==
INVALID);
203 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
208 auto const result = env.rpc(COMMAND,
to_string(tx->getTransactionID()),
to_string(20));
215 BEAST_EXPECT(result[jss::result][jss::status] == jss::error);
217 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
222 auto const result = env.rpc(
230 result[jss::result][jss::status] == jss::error && result[jss::result][jss::error] == EXCESSIVE);
232 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
241 using namespace test::jtx;
244 char const* COMMAND = jss::tx.c_str();
245 char const* BINARY = jss::binary.c_str();
251 uint32_t netID = env.app().config().NETWORK_ID;
253 auto const alice = Account(
"alice");
254 env.fund(XRP(1000), alice);
259 auto const startLegSeq = env.current()->header().seq;
260 for (
int i = 0; i < 750; ++i)
265 metas.
emplace_back(env.closed()->txRead(env.tx()->getTransactionID()).second);
267 auto const endLegSeq = env.closed()->header().seq;
270 for (
size_t i = 0; i < txns.
size(); ++i)
272 auto const& tx = txns[i];
273 auto const& meta = metas[i];
274 uint32_t txnIdx = meta->getFieldU32(sfTransactionIndex);
275 auto const result = env.rpc(
282 BEAST_EXPECT(result[jss::result][jss::status] == jss::success);
283 BEAST_EXPECT(result[jss::result][jss::tx] ==
strHex(tx->getSerializer().getData()));
284 BEAST_EXPECT(result[jss::result][jss::meta] ==
strHex(meta->getSerializer().getData()));
287 auto const tx = env.jt(
noop(alice), seq(env.seq(alice))).stx;
288 auto const ctid = *
RPC::encodeCTID(endLegSeq, tx->getSeqValue(), netID);
289 for (
int deltaEndSeq = 0; deltaEndSeq < 2; ++deltaEndSeq)
292 env.rpc(COMMAND, ctid, BINARY,
to_string(startLegSeq),
to_string(endLegSeq + deltaEndSeq));
295 result[jss::result][jss::status] == jss::error && result[jss::result][jss::error] == NOT_FOUND);
298 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
300 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
304 for (
size_t i = 0; i < txns.
size(); ++i)
307 auto const& meta = metas[i];
308 uint32_t txnIdx = meta->getFieldU32(sfTransactionIndex);
309 auto const result = env.rpc(
316 BEAST_EXPECT(result[jss::result][jss::status] == jss::success);
317 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
320 auto const deletedLedger = (startLegSeq + endLegSeq) / 2;
324 ->deleteTransactionByLedgerSeq(deletedLedger);
327 for (
int deltaEndSeq = 0; deltaEndSeq < 2; ++deltaEndSeq)
330 env.rpc(COMMAND, ctid, BINARY,
to_string(startLegSeq),
to_string(endLegSeq + deltaEndSeq));
333 result[jss::result][jss::status] == jss::error && result[jss::result][jss::error] == NOT_FOUND);
334 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
340 auto const result = env.rpc(COMMAND, ctid,
to_string(startLegSeq),
to_string(endLegSeq));
343 result[jss::result][jss::status] == jss::error && result[jss::result][jss::error] == NOT_FOUND);
345 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
351 auto const result = env.rpc(COMMAND, ctid,
to_string(startLegSeq),
to_string(deletedLedger - 1));
354 result[jss::result][jss::status] == jss::error && result[jss::result][jss::error] == NOT_FOUND);
356 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
362 auto const& meta = metas[0];
363 uint32_t txnIdx = meta->getFieldU32(sfTransactionIndex);
364 auto const result = env.rpc(
370 BEAST_EXPECT(result[jss::result][jss::status] == jss::success);
371 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
376 auto const result = env.rpc(COMMAND, ctid, BINARY,
to_string(deletedLedger - 1),
to_string(startLegSeq));
378 BEAST_EXPECT(result[jss::result][jss::status] == jss::error && result[jss::result][jss::error] ==
INVALID);
380 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
385 auto const result = env.rpc(COMMAND, ctid, BINARY,
to_string(-1),
to_string(deletedLedger - 1));
387 BEAST_EXPECT(result[jss::result][jss::status] == jss::error && result[jss::result][jss::error] ==
INVALID);
389 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
396 BEAST_EXPECT(result[jss::result][jss::status] == jss::error && result[jss::result][jss::error] ==
INVALID);
398 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
403 auto const result = env.rpc(COMMAND, ctid, BINARY,
to_string(20));
405 BEAST_EXPECT(result[jss::result][jss::status] == jss::error && result[jss::result][jss::error] ==
INVALID);
407 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
412 auto const result = env.rpc(COMMAND, ctid,
to_string(20));
419 BEAST_EXPECT(result[jss::result][jss::status] == jss::error);
421 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
426 auto const result = env.rpc(COMMAND, ctid, BINARY,
to_string(startLegSeq),
to_string(startLegSeq + 1001));
429 result[jss::result][jss::status] == jss::error && result[jss::result][jss::error] == EXCESSIVE);
431 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
440 using namespace test::jtx;
447 BEAST_EXPECT(
RPC::encodeCTID(0x0FFF'FFFFUL, 0xFFFFU, 0xFFFFU) == expected11);
453 BEAST_EXPECT(
RPC::encodeCTID(13249191UL, 12911U, 65535U) == expected14);
469 auto const expected53 =
519 using namespace test::jtx;
522 for (uint32_t netID : {11111, 65535, 65536})
525 BEAST_EXPECT(netID == env.app().config().NETWORK_ID);
527 auto const alice = Account(
"alice");
528 auto const bob = Account(
"bob");
530 auto const startLegSeq = env.current()->header().seq;
531 env.fund(XRP(10000), alice, bob);
532 env(pay(alice, bob, XRP(10)));
544 jsonTx[jss::binary] =
false;
545 jsonTx[jss::ctid] = *ctid;
547 auto const jrr = env.rpc(
"json",
"tx",
to_string(jsonTx))[jss::result];
548 BEAST_EXPECT(jrr[jss::ctid] == ctid);
549 BEAST_EXPECT(jrr.isMember(jss::hash));
557 Account
const alice = Account(
"alice");
558 Account
const bob = Account(
"bob");
560 std::uint32_t const startLegSeq = env.current()->header().seq;
561 env.fund(XRP(10000), alice, bob);
562 env(pay(alice, bob, XRP(10)));
566 auto isUpper = [](
char c) {
return std::isupper(c) != 0; };
576 *iter = std::tolower(*iter);
578 BEAST_EXPECT(ctid != mixedCase);
581 jsonTx[jss::binary] =
false;
582 jsonTx[jss::ctid] = mixedCase;
585 BEAST_EXPECT(jrr[jss::ctid] == ctid);
586 BEAST_EXPECT(jrr[jss::hash]);
593 for (uint32_t netID : {2, 1024, 65535, 65536})
596 BEAST_EXPECT(netID == env.app().config().NETWORK_ID);
598 auto const alice = Account(
"alice");
599 auto const bob = Account(
"bob");
601 env.fund(XRP(10000), alice, bob);
602 env(pay(alice, bob, XRP(10)));
605 auto const ledgerSeq = env.current()->header().seq;
613 params[jss::transaction] = hash;
614 auto const jrr = env.rpc(
"json",
"tx",
to_string(params))[jss::result];
615 BEAST_EXPECT(jrr[jss::hash] == hash);
617 BEAST_EXPECT(jrr.isMember(jss::ctid) == (netID <= 0xFFFF));
618 if (jrr.isMember(jss::ctid))
621 BEAST_EXPECT(jrr[jss::ctid] == *ctid);
628 uint32_t netID = env.app().config().NETWORK_ID;
630 auto const alice = Account(
"alice");
631 auto const bob = Account(
"bob");
633 auto const startLegSeq = env.current()->header().seq;
634 env.fund(XRP(10000), alice, bob);
635 env(pay(alice, bob, XRP(10)));
640 jsonTx[jss::binary] =
false;
641 jsonTx[jss::ctid] = ctid;
643 auto const jrr = env.rpc(
"json",
"tx",
to_string(jsonTx))[jss::result];
644 BEAST_EXPECT(jrr[jss::error] ==
"wrongNetwork");
647 jrr[jss::error_message] ==
648 "Wrong network. You should submit this request to a node "
649 "running on NetworkID: 21338");
658 using namespace test::jtx;
662 cfg->FEES.reference_fee = 10;
665 Account
const alice{
"alice"};
666 Account
const alie{
"alie"};
667 Account
const gw{
"gw"};
668 auto const USD{gw[
"USD"]};
670 env.fund(XRP(1000000), alice, gw);
677 env(pay(alice, gw, XRP(100)));
684 expected[jss::DeliverMax] = expected[jss::Amount];
691 Json::Value const result = {[&env, txn, apiVersion]() {
693 params[jss::transaction] =
to_string(txn->getTransactionID());
694 params[jss::binary] =
false;
695 params[jss::api_version] = apiVersion;
696 return env.client().invoke(
"tx", params);
699 BEAST_EXPECT(result[jss::result][jss::status] == jss::success);
702 BEAST_EXPECT(result[jss::result][jss::close_time_iso] ==
"2000-01-01T00:00:20Z");
703 BEAST_EXPECT(result[jss::result][jss::hash] ==
to_string(txn->getTransactionID()));
704 BEAST_EXPECT(result[jss::result][jss::validated] ==
true);
705 BEAST_EXPECT(result[jss::result][jss::ledger_index] == 4);
707 result[jss::result][jss::ledger_hash] ==
708 "B41882E20F0EC6228417D28B9AE0F33833645D35F6799DFB782AC97FC4BB51"
712 for (
auto memberIt = expected.
begin(); memberIt != expected.
end(); memberIt++)
715 auto const& result_transaction = (apiVersion > 1 ? result[jss::result][jss::tx_json] : result[jss::result]);
716 if (BEAST_EXPECT(result_transaction.isMember(name)))
718 auto const received = result_transaction[name];
720 received == *memberIt,
721 "Transaction contains \n\"" + name +
"\": "
734 using namespace test::jtx;
738 cfg->FEES.reference_fee = 10;
741 Account
const alice{
"alice"};
742 Account
const gw{
"gw"};
743 auto const USD{gw[
"USD"]};
745 env.fund(XRP(1000000), alice, gw);
748 to_string(txn->getTransactionID()) ==
"3F8BDE5A5F82C4F4708E5E9255B713E303E6E1A371FD5C7A704AFD1387C23981");
755 Json::Value const result = [&env, txn, apiVersion]() {
757 params[jss::transaction] =
to_string(txn->getTransactionID());
758 params[jss::binary] =
true;
759 params[jss::api_version] = apiVersion;
760 return env.client().invoke(
"tx", params);
763 if (BEAST_EXPECT(result[jss::status] ==
"success"))
765 BEAST_EXPECT(result[jss::result][jss::status] ==
"success");
766 BEAST_EXPECT(result[jss::result][jss::validated] ==
true);
767 BEAST_EXPECT(result[jss::result][jss::hash] ==
to_string(txn->getTransactionID()));
768 BEAST_EXPECT(result[jss::result][jss::ledger_index] == 3);
769 BEAST_EXPECT(result[jss::result][jss::ctid] ==
"C000000300030000");
773 BEAST_EXPECT(result[jss::result][jss::tx_blob] == expected_tx_blob);
774 BEAST_EXPECT(result[jss::result][jss::meta_blob] == expected_meta_blob);
776 result[jss::result][jss::ledger_hash] ==
777 "2D5150E5A5AA436736A732291E437ABF01BC9E206C2DF3C77C4F856915"
779 BEAST_EXPECT(result[jss::result][jss::close_time_iso] ==
"2000-01-01T00:00:10Z");
783 BEAST_EXPECT(result[jss::result][jss::tx] == expected_tx_blob);
784 BEAST_EXPECT(result[jss::result][jss::meta] == expected_meta_blob);
785 BEAST_EXPECT(result[jss::result][jss::date] == 10);