63 char const* command = jss::tx.cStr();
64 char const* binary = jss::binary.cStr();
69 Env env{*
this, features};
70 auto const alice =
Account(
"alice");
71 env.fund(XRP(1000), alice);
76 auto const startLegSeq = env.current()->header().seq;
77 for (
int i = 0; i < 750; ++i)
82 metas.
emplace_back(env.closed()->txRead(env.tx()->getTransactionID()).second);
84 auto const endLegSeq = env.closed()->header().seq;
87 for (
size_t i = 0; i < txns.
size(); ++i)
89 auto const& tx = txns[i];
90 auto const& meta = metas[i];
91 auto const result = env.rpc(
98 BEAST_EXPECT(result[jss::result][jss::status] == jss::success);
99 BEAST_EXPECT(result[jss::result][jss::tx] ==
strHex(tx->getSerializer().getData()));
100 BEAST_EXPECT(result[jss::result][jss::meta] ==
strHex(meta->getSerializer().getData()));
103 auto const tx = env.jt(noop(alice), Seq(env.seq(alice))).stx;
104 for (
int deltaEndSeq = 0; deltaEndSeq < 2; ++deltaEndSeq)
106 auto const result = env.rpc(
114 result[jss::result][jss::status] == jss::error &&
115 result[jss::result][jss::error] == notFound);
117 if (deltaEndSeq != 0)
119 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
123 BEAST_EXPECT(result[jss::result][jss::searched_all].asBool());
128 for (
auto&& tx : txns)
130 auto const result = env.rpc(
137 BEAST_EXPECT(result[jss::result][jss::status] == jss::success);
138 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
141 auto const deletedLedger = (startLegSeq + endLegSeq) / 2;
144 env.app().getRelationalDatabase().deleteTransactionByLedgerSeq(deletedLedger);
147 for (
int deltaEndSeq = 0; deltaEndSeq < 2; ++deltaEndSeq)
149 auto const result = env.rpc(
157 result[jss::result][jss::status] == jss::error &&
158 result[jss::result][jss::error] == notFound);
159 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
165 auto const result = env.rpc(
172 result[jss::result][jss::status] == jss::error &&
173 result[jss::result][jss::error] == notFound);
175 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
181 auto const result = env.rpc(
188 result[jss::result][jss::status] == jss::error &&
189 result[jss::result][jss::error] == notFound);
191 BEAST_EXPECT(result[jss::result][jss::searched_all].asBool());
197 auto const result = env.rpc(
203 BEAST_EXPECT(result[jss::result][jss::status] == jss::success);
204 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
209 auto const result = env.rpc(
217 result[jss::result][jss::status] == jss::error &&
218 result[jss::result][jss::error] == invalid);
220 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
225 auto const result = env.rpc(
233 result[jss::result][jss::status] == jss::error &&
234 result[jss::result][jss::error] == invalid);
236 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
241 auto const result = env.rpc(
245 result[jss::result][jss::status] == jss::error &&
246 result[jss::result][jss::error] == invalid);
248 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
257 result[jss::result][jss::status] == jss::error &&
258 result[jss::result][jss::error] == invalid);
260 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
265 auto const result = env.rpc(command,
to_string(tx->getTransactionID()),
to_string(20));
272 BEAST_EXPECT(result[jss::result][jss::status] == jss::error);
274 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
279 auto const result = env.rpc(
287 result[jss::result][jss::status] == jss::error &&
288 result[jss::result][jss::error] == excessive);
290 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
302 char const* command = jss::tx.cStr();
303 char const* binary = jss::binary.cStr();
309 uint32_t
const netID = env.app().getNetworkIDService().getNetworkID();
311 auto const alice =
Account(
"alice");
312 env.fund(XRP(1000), alice);
317 auto const startLegSeq = env.current()->header().seq;
318 for (
int i = 0; i < 750; ++i)
323 metas.
emplace_back(env.closed()->txRead(env.tx()->getTransactionID()).second);
325 auto const endLegSeq = env.closed()->header().seq;
328 for (
size_t i = 0; i < txns.
size(); ++i)
330 auto const& tx = txns[i];
331 auto const& meta = metas[i];
332 uint32_t
const txnIdx = meta->getFieldU32(sfTransactionIndex);
333 auto const result = env.rpc(
341 BEAST_EXPECT(result[jss::result][jss::status] == jss::success);
342 BEAST_EXPECT(result[jss::result][jss::tx] ==
strHex(tx->getSerializer().getData()));
343 BEAST_EXPECT(result[jss::result][jss::meta] ==
strHex(meta->getSerializer().getData()));
346 auto const tx = env.jt(noop(alice), Seq(env.seq(alice))).stx;
348 auto const ctid = *
RPC::encodeCTID(endLegSeq, tx->getSeqValue(), netID);
349 for (
int deltaEndSeq = 0; deltaEndSeq < 2; ++deltaEndSeq)
351 auto const result = env.rpc(
355 result[jss::result][jss::status] == jss::error &&
356 result[jss::result][jss::error] == notFound);
358 if (deltaEndSeq != 0)
360 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
364 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
369 for (
size_t i = 0; i < txns.
size(); ++i)
372 auto const& meta = metas[i];
373 uint32_t
const txnIdx = meta->getFieldU32(sfTransactionIndex);
374 auto const result = env.rpc(
382 BEAST_EXPECT(result[jss::result][jss::status] == jss::success);
383 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
386 auto const deletedLedger = (startLegSeq + endLegSeq) / 2;
389 env.app().getRelationalDatabase().deleteTransactionByLedgerSeq(deletedLedger);
392 for (
int deltaEndSeq = 0; deltaEndSeq < 2; ++deltaEndSeq)
394 auto const result = env.rpc(
398 result[jss::result][jss::status] == jss::error &&
399 result[jss::result][jss::error] == notFound);
400 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
410 result[jss::result][jss::status] == jss::error &&
411 result[jss::result][jss::error] == notFound);
413 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
423 result[jss::result][jss::status] == jss::error &&
424 result[jss::result][jss::error] == notFound);
426 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
432 auto const& meta = metas[0];
433 uint32_t
const txnIdx = meta->getFieldU32(sfTransactionIndex);
434 auto const result = env.rpc(
441 BEAST_EXPECT(result[jss::result][jss::status] == jss::success);
442 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
447 auto const result = env.rpc(
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));
463 result[jss::result][jss::status] == jss::error &&
464 result[jss::result][jss::error] == invalid);
466 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
474 result[jss::result][jss::status] == jss::error &&
475 result[jss::result][jss::error] == invalid);
477 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
482 auto const result = env.rpc(command, ctid, binary,
to_string(20));
485 result[jss::result][jss::status] == jss::error &&
486 result[jss::result][jss::error] == invalid);
488 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
493 auto const result = env.rpc(command, ctid,
to_string(20));
500 BEAST_EXPECT(result[jss::result][jss::status] == jss::error);
502 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
507 auto const result = env.rpc(
511 result[jss::result][jss::status] == jss::error &&
512 result[jss::result][jss::error] == excessive);
514 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
530 BEAST_EXPECT(
RPC::encodeCTID(0x0FFF'FFFFUL, 0xFFFFU, 0xFFFFU) == expected11);
536 BEAST_EXPECT(
RPC::encodeCTID(13249191UL, 12911U, 65535U) == expected14);
548 auto const expected51 =
551 auto const expected52 =
609 for (uint32_t
const netID : {11111, 65535, 65536})
612 BEAST_EXPECT(netID == env.app().getNetworkIDService().getNetworkID());
614 auto const alice =
Account(
"alice");
615 auto const bob =
Account(
"bob");
617 auto const startLegSeq = env.current()->header().seq;
618 env.fund(XRP(10000), alice, bob);
619 env(pay(alice, bob, XRP(10)));
626 BEAST_EXPECT(ctid == std::nullopt);
631 jsonTx[jss::binary] =
false;
632 jsonTx[jss::ctid] = *ctid;
634 auto const jrr = env.rpc(
"json",
"tx",
to_string(jsonTx))[jss::result];
635 BEAST_EXPECT(jrr[jss::ctid] == ctid);
636 BEAST_EXPECT(jrr.isMember(jss::hash));
642 std::uint32_t const netID = env.app().getNetworkIDService().getNetworkID();
647 std::uint32_t const startLegSeq = env.current()->header().seq;
648 env.fund(XRP(10000), alice, bob);
649 env(pay(alice, bob, XRP(10)));
654 auto isUpper = [](
char c) {
return std::isupper(c) != 0; };
664 *iter = std::tolower(*iter);
666 BEAST_EXPECT(ctid != mixedCase);
669 jsonTx[jss::binary] =
false;
670 jsonTx[jss::ctid] = mixedCase;
673 BEAST_EXPECT(jrr[jss::ctid] == ctid);
674 BEAST_EXPECT(jrr[jss::hash]);
681 for (uint32_t
const netID : {2, 1024, 65535, 65536})
684 BEAST_EXPECT(netID == env.app().getNetworkIDService().getNetworkID());
686 auto const alice =
Account(
"alice");
687 auto const bob =
Account(
"bob");
689 env.fund(XRP(10000), alice, bob);
690 env(pay(alice, bob, XRP(10)));
693 auto const ledgerSeq = env.current()->header().seq;
701 params[jss::transaction] = hash;
702 auto const jrr = env.rpc(
"json",
"tx",
to_string(params))[jss::result];
703 BEAST_EXPECT(jrr[jss::hash] == hash);
705 BEAST_EXPECT(jrr.isMember(jss::ctid) == (netID <= 0xFFFF));
706 if (jrr.isMember(jss::ctid))
710 jrr[jss::ctid] == *ctid);
717 uint32_t
const netID = env.app().getNetworkIDService().getNetworkID();
719 auto const alice =
Account(
"alice");
720 auto const bob =
Account(
"bob");
722 auto const startLegSeq = env.current()->header().seq;
723 env.fund(XRP(10000), alice, bob);
724 env(pay(alice, bob, XRP(10)));
730 jsonTx[jss::binary] =
false;
731 jsonTx[jss::ctid] = ctid;
733 auto const jrr = env.rpc(
"json",
"tx",
to_string(jsonTx))[jss::result];
734 BEAST_EXPECT(jrr[jss::error] ==
"wrongNetwork");
737 jrr[jss::error_message] ==
738 "Wrong network. You should submit this request to a node "
739 "running on NetworkID: 21338");
752 cfg->fees.referenceFee = 10;
758 auto const usd{gw[
"USD"]};
760 env.fund(XRP(1000000), alice, gw);
767 env(pay(alice, gw, XRP(100)));
772 env.closed()->txRead(env.tx()->getTransactionID()).second;
775 expected[jss::DeliverMax] = expected[jss::Amount];
782 json::Value const result = {[&env, txn, apiVersion]() {
784 params[jss::transaction] =
to_string(txn->getTransactionID());
785 params[jss::binary] =
false;
786 params[jss::api_version] = apiVersion;
787 return env.client().invoke(
"tx", params);
790 BEAST_EXPECT(result[jss::result][jss::status] == jss::success);
793 BEAST_EXPECT(result[jss::result][jss::close_time_iso] ==
"2000-01-01T00:00:20Z");
794 BEAST_EXPECT(result[jss::result][jss::hash] ==
to_string(txn->getTransactionID()));
795 BEAST_EXPECT(result[jss::result][jss::validated] ==
true);
796 BEAST_EXPECT(result[jss::result][jss::ledger_index] == 4);
798 result[jss::result][jss::ledger_hash] ==
799 "B41882E20F0EC6228417D28B9AE0F33833645D35F6799DFB782AC97FC4BB51"
803 for (
auto memberIt = expected.
begin(); memberIt != expected.
end(); memberIt++)
806 auto const& resultTransaction =
807 (apiVersion > 1 ? result[jss::result][jss::tx_json] : result[jss::result]);
808 if (BEAST_EXPECT(resultTransaction.isMember(name)))
810 auto const received = resultTransaction[name];
812 received == *memberIt,
813 "Transaction contains \n\"" + name +
"\": "
830 cfg->fees.referenceFee = 10;
835 auto const usd{gw[
"USD"]};
837 env.fund(XRP(1000000), alice, gw);
841 "3F8BDE5A5F82C4F4708E5E9255B713E303E6E1A371FD5C7A704AFD1387C23981");
844 env.closed()->txRead(txn->getTransactionID()).second;
849 json::Value const result = [&env, txn, apiVersion]() {
851 params[jss::transaction] =
to_string(txn->getTransactionID());
852 params[jss::binary] =
true;
853 params[jss::api_version] = apiVersion;
854 return env.client().invoke(
"tx", params);
857 if (BEAST_EXPECT(result[jss::status] ==
"success"))
859 BEAST_EXPECT(result[jss::result][jss::status] ==
"success");
860 BEAST_EXPECT(result[jss::result][jss::validated] ==
true);
861 BEAST_EXPECT(result[jss::result][jss::hash] ==
to_string(txn->getTransactionID()));
862 BEAST_EXPECT(result[jss::result][jss::ledger_index] == 3);
863 BEAST_EXPECT(result[jss::result][jss::ctid] ==
"C000000300030000");
867 BEAST_EXPECT(result[jss::result][jss::tx_blob] == expectedTxBlob);
868 BEAST_EXPECT(result[jss::result][jss::meta_blob] == expectedMetaBlob);
870 result[jss::result][jss::ledger_hash] ==
871 "2D5150E5A5AA436736A732291E437ABF01BC9E206C2DF3C77C4F856915"
873 BEAST_EXPECT(result[jss::result][jss::close_time_iso] ==
"2000-01-01T00:00:10Z");
877 BEAST_EXPECT(result[jss::result][jss::tx] == expectedTxBlob);
878 BEAST_EXPECT(result[jss::result][jss::meta] == expectedMetaBlob);
879 BEAST_EXPECT(result[jss::result][jss::date] == 10);