37 using namespace test::jtx;
40 char const* COMMAND = jss::tx.c_str();
41 char const* BINARY = jss::binary.c_str();
46 Env env{*
this, features};
47 auto const alice = Account(
"alice");
48 env.fund(XRP(1000), alice);
53 auto const startLegSeq = env.current()->header().seq;
54 for (
int i = 0; i < 750; ++i)
59 metas.
emplace_back(env.closed()->txRead(env.tx()->getTransactionID()).second);
61 auto const endLegSeq = env.closed()->header().seq;
64 for (
size_t i = 0; i < txns.
size(); ++i)
66 auto const& tx = txns[i];
67 auto const& meta = metas[i];
68 auto const result = env.rpc(
75 BEAST_EXPECT(result[jss::result][jss::status] == jss::success);
76 BEAST_EXPECT(result[jss::result][jss::tx] ==
strHex(tx->getSerializer().getData()));
77 BEAST_EXPECT(result[jss::result][jss::meta] ==
strHex(meta->getSerializer().getData()));
80 auto const tx = env.jt(
noop(alice), seq(env.seq(alice))).stx;
81 for (
int deltaEndSeq = 0; deltaEndSeq < 2; ++deltaEndSeq)
83 auto const result = env.rpc(
91 result[jss::result][jss::status] == jss::error &&
92 result[jss::result][jss::error] == NOT_FOUND);
96 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
100 BEAST_EXPECT(result[jss::result][jss::searched_all].asBool());
105 for (
auto&& tx : txns)
107 auto const result = env.rpc(
114 BEAST_EXPECT(result[jss::result][jss::status] == jss::success);
115 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
118 auto const deletedLedger = (startLegSeq + endLegSeq) / 2;
121 env.app().getRelationalDatabase().deleteTransactionByLedgerSeq(deletedLedger);
124 for (
int deltaEndSeq = 0; deltaEndSeq < 2; ++deltaEndSeq)
126 auto const result = env.rpc(
134 result[jss::result][jss::status] == jss::error &&
135 result[jss::result][jss::error] == NOT_FOUND);
136 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
142 auto const result = env.rpc(
149 result[jss::result][jss::status] == jss::error &&
150 result[jss::result][jss::error] == NOT_FOUND);
152 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
158 auto const result = env.rpc(
165 result[jss::result][jss::status] == jss::error &&
166 result[jss::result][jss::error] == NOT_FOUND);
168 BEAST_EXPECT(result[jss::result][jss::searched_all].asBool());
174 auto const result = env.rpc(
180 BEAST_EXPECT(result[jss::result][jss::status] == jss::success);
181 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
186 auto const result = env.rpc(
194 result[jss::result][jss::status] == jss::error &&
195 result[jss::result][jss::error] ==
INVALID);
197 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
202 auto const result = env.rpc(
210 result[jss::result][jss::status] == jss::error &&
211 result[jss::result][jss::error] ==
INVALID);
213 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
218 auto const result = env.rpc(
222 result[jss::result][jss::status] == jss::error &&
223 result[jss::result][jss::error] ==
INVALID);
225 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
234 result[jss::result][jss::status] == jss::error &&
235 result[jss::result][jss::error] ==
INVALID);
237 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
242 auto const result = env.rpc(COMMAND,
to_string(tx->getTransactionID()),
to_string(20));
249 BEAST_EXPECT(result[jss::result][jss::status] == jss::error);
251 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
256 auto const result = env.rpc(
264 result[jss::result][jss::status] == jss::error &&
265 result[jss::result][jss::error] == EXCESSIVE);
267 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
276 using namespace test::jtx;
279 char const* COMMAND = jss::tx.c_str();
280 char const* BINARY = jss::binary.c_str();
286 uint32_t
const netID = env.app().getNetworkIDService().getNetworkID();
288 auto const alice = Account(
"alice");
289 env.fund(XRP(1000), alice);
294 auto const startLegSeq = env.current()->header().seq;
295 for (
int i = 0; i < 750; ++i)
300 metas.
emplace_back(env.closed()->txRead(env.tx()->getTransactionID()).second);
302 auto const endLegSeq = env.closed()->header().seq;
305 for (
size_t i = 0; i < txns.
size(); ++i)
307 auto const& tx = txns[i];
308 auto const& meta = metas[i];
309 uint32_t
const txnIdx = meta->getFieldU32(sfTransactionIndex);
310 auto const result = env.rpc(
318 BEAST_EXPECT(result[jss::result][jss::status] == jss::success);
319 BEAST_EXPECT(result[jss::result][jss::tx] ==
strHex(tx->getSerializer().getData()));
320 BEAST_EXPECT(result[jss::result][jss::meta] ==
strHex(meta->getSerializer().getData()));
323 auto const tx = env.jt(
noop(alice), seq(env.seq(alice))).stx;
325 auto const ctid = *
RPC::encodeCTID(endLegSeq, tx->getSeqValue(), netID);
326 for (
int deltaEndSeq = 0; deltaEndSeq < 2; ++deltaEndSeq)
328 auto const result = env.rpc(
332 result[jss::result][jss::status] == jss::error &&
333 result[jss::result][jss::error] == NOT_FOUND);
335 if (deltaEndSeq != 0)
337 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
341 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
346 for (
size_t i = 0; i < txns.
size(); ++i)
349 auto const& meta = metas[i];
350 uint32_t
const txnIdx = meta->getFieldU32(sfTransactionIndex);
351 auto const result = env.rpc(
359 BEAST_EXPECT(result[jss::result][jss::status] == jss::success);
360 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
363 auto const deletedLedger = (startLegSeq + endLegSeq) / 2;
366 env.app().getRelationalDatabase().deleteTransactionByLedgerSeq(deletedLedger);
369 for (
int deltaEndSeq = 0; deltaEndSeq < 2; ++deltaEndSeq)
371 auto const result = env.rpc(
375 result[jss::result][jss::status] == jss::error &&
376 result[jss::result][jss::error] == NOT_FOUND);
377 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
387 result[jss::result][jss::status] == jss::error &&
388 result[jss::result][jss::error] == NOT_FOUND);
390 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
400 result[jss::result][jss::status] == jss::error &&
401 result[jss::result][jss::error] == NOT_FOUND);
403 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
409 auto const& meta = metas[0];
410 uint32_t
const txnIdx = meta->getFieldU32(sfTransactionIndex);
411 auto const result = env.rpc(
418 BEAST_EXPECT(result[jss::result][jss::status] == jss::success);
419 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
424 auto const result = env.rpc(
428 result[jss::result][jss::status] == jss::error &&
429 result[jss::result][jss::error] ==
INVALID);
431 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
440 result[jss::result][jss::status] == jss::error &&
441 result[jss::result][jss::error] ==
INVALID);
443 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
451 result[jss::result][jss::status] == jss::error &&
452 result[jss::result][jss::error] ==
INVALID);
454 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
459 auto const result = env.rpc(COMMAND, ctid, BINARY,
to_string(20));
462 result[jss::result][jss::status] == jss::error &&
463 result[jss::result][jss::error] ==
INVALID);
465 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
470 auto const result = env.rpc(COMMAND, ctid,
to_string(20));
477 BEAST_EXPECT(result[jss::result][jss::status] == jss::error);
479 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
484 auto const result = env.rpc(
488 result[jss::result][jss::status] == jss::error &&
489 result[jss::result][jss::error] == EXCESSIVE);
491 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
500 using namespace test::jtx;
507 BEAST_EXPECT(
RPC::encodeCTID(0x0FFF'FFFFUL, 0xFFFFU, 0xFFFFU) == expected11);
513 BEAST_EXPECT(
RPC::encodeCTID(13249191UL, 12911U, 65535U) == expected14);
525 auto const expected51 =
528 auto const expected52 =
583 using namespace test::jtx;
586 for (uint32_t
const netID : {11111, 65535, 65536})
589 BEAST_EXPECT(netID == env.app().getNetworkIDService().getNetworkID());
591 auto const alice = Account(
"alice");
592 auto const bob = Account(
"bob");
594 auto const startLegSeq = env.current()->header().seq;
595 env.fund(XRP(10000), alice, bob);
596 env(pay(alice, bob, XRP(10)));
608 jsonTx[jss::binary] =
false;
609 jsonTx[jss::ctid] = *ctid;
611 auto const jrr = env.rpc(
"json",
"tx",
to_string(jsonTx))[jss::result];
612 BEAST_EXPECT(jrr[jss::ctid] == ctid);
613 BEAST_EXPECT(jrr.isMember(jss::hash));
619 std::uint32_t const netID = env.app().getNetworkIDService().getNetworkID();
621 Account
const alice = Account(
"alice");
622 Account
const bob = Account(
"bob");
624 std::uint32_t const startLegSeq = env.current()->header().seq;
625 env.fund(XRP(10000), alice, bob);
626 env(pay(alice, bob, XRP(10)));
631 auto isUpper = [](
char c) {
return std::isupper(c) != 0; };
641 *iter = std::tolower(*iter);
643 BEAST_EXPECT(ctid != mixedCase);
646 jsonTx[jss::binary] =
false;
647 jsonTx[jss::ctid] = mixedCase;
650 BEAST_EXPECT(jrr[jss::ctid] == ctid);
651 BEAST_EXPECT(jrr[jss::hash]);
658 for (uint32_t
const netID : {2, 1024, 65535, 65536})
661 BEAST_EXPECT(netID == env.app().getNetworkIDService().getNetworkID());
663 auto const alice = Account(
"alice");
664 auto const bob = Account(
"bob");
666 env.fund(XRP(10000), alice, bob);
667 env(pay(alice, bob, XRP(10)));
670 auto const ledgerSeq = env.current()->header().seq;
678 params[jss::transaction] = hash;
679 auto const jrr = env.rpc(
"json",
"tx",
to_string(params))[jss::result];
680 BEAST_EXPECT(jrr[jss::hash] == hash);
682 BEAST_EXPECT(jrr.isMember(jss::ctid) == (netID <= 0xFFFF));
683 if (jrr.isMember(jss::ctid))
687 jrr[jss::ctid] == *ctid);
694 uint32_t
const netID = env.app().getNetworkIDService().getNetworkID();
696 auto const alice = Account(
"alice");
697 auto const bob = Account(
"bob");
699 auto const startLegSeq = env.current()->header().seq;
700 env.fund(XRP(10000), alice, bob);
701 env(pay(alice, bob, XRP(10)));
707 jsonTx[jss::binary] =
false;
708 jsonTx[jss::ctid] = ctid;
710 auto const jrr = env.rpc(
"json",
"tx",
to_string(jsonTx))[jss::result];
711 BEAST_EXPECT(jrr[jss::error] ==
"wrongNetwork");
714 jrr[jss::error_message] ==
715 "Wrong network. You should submit this request to a node "
716 "running on NetworkID: 21338");
725 using namespace test::jtx;
729 cfg->FEES.reference_fee = 10;
732 Account
const alice{
"alice"};
733 Account
const alie{
"alie"};
734 Account
const gw{
"gw"};
735 auto const USD{gw[
"USD"]};
737 env.fund(XRP(1000000), alice, gw);
744 env(pay(alice, gw, XRP(100)));
749 env.closed()->txRead(env.tx()->getTransactionID()).second;
752 expected[jss::DeliverMax] = expected[jss::Amount];
759 Json::Value const result = {[&env, txn, apiVersion]() {
761 params[jss::transaction] =
to_string(txn->getTransactionID());
762 params[jss::binary] =
false;
763 params[jss::api_version] = apiVersion;
764 return env.client().invoke(
"tx", params);
767 BEAST_EXPECT(result[jss::result][jss::status] == jss::success);
770 BEAST_EXPECT(result[jss::result][jss::close_time_iso] ==
"2000-01-01T00:00:20Z");
771 BEAST_EXPECT(result[jss::result][jss::hash] ==
to_string(txn->getTransactionID()));
772 BEAST_EXPECT(result[jss::result][jss::validated] ==
true);
773 BEAST_EXPECT(result[jss::result][jss::ledger_index] == 4);
775 result[jss::result][jss::ledger_hash] ==
776 "B41882E20F0EC6228417D28B9AE0F33833645D35F6799DFB782AC97FC4BB51"
780 for (
auto memberIt = expected.
begin(); memberIt != expected.
end(); memberIt++)
783 auto const& result_transaction =
784 (apiVersion > 1 ? result[jss::result][jss::tx_json] : result[jss::result]);
785 if (BEAST_EXPECT(result_transaction.isMember(name)))
787 auto const received = result_transaction[name];
789 received == *memberIt,
790 "Transaction contains \n\"" + name +
"\": "
803 using namespace test::jtx;
807 cfg->FEES.reference_fee = 10;
810 Account
const alice{
"alice"};
811 Account
const gw{
"gw"};
812 auto const USD{gw[
"USD"]};
814 env.fund(XRP(1000000), alice, gw);
818 "3F8BDE5A5F82C4F4708E5E9255B713E303E6E1A371FD5C7A704AFD1387C23981");
821 env.closed()->txRead(txn->getTransactionID()).second;
826 Json::Value const result = [&env, txn, apiVersion]() {
828 params[jss::transaction] =
to_string(txn->getTransactionID());
829 params[jss::binary] =
true;
830 params[jss::api_version] = apiVersion;
831 return env.client().invoke(
"tx", params);
834 if (BEAST_EXPECT(result[jss::status] ==
"success"))
836 BEAST_EXPECT(result[jss::result][jss::status] ==
"success");
837 BEAST_EXPECT(result[jss::result][jss::validated] ==
true);
838 BEAST_EXPECT(result[jss::result][jss::hash] ==
to_string(txn->getTransactionID()));
839 BEAST_EXPECT(result[jss::result][jss::ledger_index] == 3);
840 BEAST_EXPECT(result[jss::result][jss::ctid] ==
"C000000300030000");
844 BEAST_EXPECT(result[jss::result][jss::tx_blob] == expected_tx_blob);
845 BEAST_EXPECT(result[jss::result][jss::meta_blob] == expected_meta_blob);
847 result[jss::result][jss::ledger_hash] ==
848 "2D5150E5A5AA436736A732291E437ABF01BC9E206C2DF3C77C4F856915"
850 BEAST_EXPECT(result[jss::result][jss::close_time_iso] ==
"2000-01-01T00:00:10Z");
854 BEAST_EXPECT(result[jss::result][jss::tx] == expected_tx_blob);
855 BEAST_EXPECT(result[jss::result][jss::meta] == expected_meta_blob);
856 BEAST_EXPECT(result[jss::result][jss::date] == 10);