36 using namespace test::jtx;
39 char const* COMMAND = jss::tx.c_str();
40 char const* BINARY = jss::binary.c_str();
43 char const* EXCESSIVE =
46 Env env{*
this, features};
47 auto const alice = Account(
"alice");
48 env.fund(XRP(1000), alice);
53 auto const startLegSeq = env.current()->info().seq;
54 for (
int i = 0; i < 750; ++i)
60 env.closed()->txRead(env.tx()->getTransactionID()).second);
62 auto const endLegSeq = env.closed()->info().seq;
65 for (
size_t i = 0; i < txns.
size(); ++i)
67 auto const& tx = txns[i];
68 auto const& meta = metas[i];
69 auto const result = env.rpc(
76 BEAST_EXPECT(result[jss::result][jss::status] == jss::success);
78 result[jss::result][jss::tx] ==
79 strHex(tx->getSerializer().getData()));
81 result[jss::result][jss::meta] ==
82 strHex(meta->getSerializer().getData()));
85 auto const tx = env.jt(
noop(alice), seq(env.seq(alice))).stx;
86 for (
int deltaEndSeq = 0; deltaEndSeq < 2; ++deltaEndSeq)
88 auto const result = env.rpc(
96 result[jss::result][jss::status] == jss::error &&
97 result[jss::result][jss::error] == NOT_FOUND);
100 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
102 BEAST_EXPECT(result[jss::result][jss::searched_all].asBool());
106 for (
auto&& tx : txns)
108 auto const result = env.rpc(
115 BEAST_EXPECT(result[jss::result][jss::status] == jss::success);
116 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
119 auto const deletedLedger = (startLegSeq + endLegSeq) / 2;
123 ->deleteTransactionByLedgerSeq(deletedLedger);
126 for (
int deltaEndSeq = 0; deltaEndSeq < 2; ++deltaEndSeq)
128 auto const result = env.rpc(
136 result[jss::result][jss::status] == jss::error &&
137 result[jss::result][jss::error] == NOT_FOUND);
138 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
144 auto const result = env.rpc(
151 result[jss::result][jss::status] == jss::error &&
152 result[jss::result][jss::error] == NOT_FOUND);
154 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
160 auto const result = env.rpc(
167 result[jss::result][jss::status] == jss::error &&
168 result[jss::result][jss::error] == NOT_FOUND);
170 BEAST_EXPECT(result[jss::result][jss::searched_all].asBool());
176 auto const result = env.rpc(
182 BEAST_EXPECT(result[jss::result][jss::status] == jss::success);
183 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
188 auto const result = env.rpc(
196 result[jss::result][jss::status] == jss::error &&
197 result[jss::result][jss::error] ==
INVALID);
199 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
204 auto const result = env.rpc(
212 result[jss::result][jss::status] == jss::error &&
213 result[jss::result][jss::error] ==
INVALID);
215 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
220 auto const result = env.rpc(
228 result[jss::result][jss::status] == jss::error &&
229 result[jss::result][jss::error] ==
INVALID);
231 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
236 auto const result = env.rpc(
243 result[jss::result][jss::status] == jss::error &&
244 result[jss::result][jss::error] ==
INVALID);
246 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
251 auto const result = env.rpc(
259 BEAST_EXPECT(result[jss::result][jss::status] == jss::error);
261 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
266 auto const result = env.rpc(
274 result[jss::result][jss::status] == jss::error &&
275 result[jss::result][jss::error] == EXCESSIVE);
277 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
286 using namespace test::jtx;
289 char const* COMMAND = jss::tx.c_str();
290 char const* BINARY = jss::binary.c_str();
293 char const* EXCESSIVE =
297 uint32_t netID = env.app().config().NETWORK_ID;
299 auto const alice = Account(
"alice");
300 env.fund(XRP(1000), alice);
305 auto const startLegSeq = env.current()->info().seq;
306 for (
int i = 0; i < 750; ++i)
312 env.closed()->txRead(env.tx()->getTransactionID()).second);
314 auto const endLegSeq = env.closed()->info().seq;
317 for (
size_t i = 0; i < txns.
size(); ++i)
319 auto const& tx = txns[i];
320 auto const& meta = metas[i];
321 uint32_t txnIdx = meta->getFieldU32(sfTransactionIndex);
322 auto const result = env.rpc(
329 BEAST_EXPECT(result[jss::result][jss::status] == jss::success);
331 result[jss::result][jss::tx] ==
332 strHex(tx->getSerializer().getData()));
334 result[jss::result][jss::meta] ==
335 strHex(meta->getSerializer().getData()));
338 auto const tx = env.jt(
noop(alice), seq(env.seq(alice))).stx;
339 auto const ctid = *
RPC::encodeCTID(endLegSeq, tx->getSeqValue(), netID);
340 for (
int deltaEndSeq = 0; deltaEndSeq < 2; ++deltaEndSeq)
342 auto const result = env.rpc(
350 result[jss::result][jss::status] == jss::error &&
351 result[jss::result][jss::error] == NOT_FOUND);
354 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
356 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
360 for (
size_t i = 0; i < txns.
size(); ++i)
363 auto const& meta = metas[i];
364 uint32_t txnIdx = meta->getFieldU32(sfTransactionIndex);
365 auto const result = env.rpc(
372 BEAST_EXPECT(result[jss::result][jss::status] == jss::success);
373 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
376 auto const deletedLedger = (startLegSeq + endLegSeq) / 2;
380 ->deleteTransactionByLedgerSeq(deletedLedger);
383 for (
int deltaEndSeq = 0; deltaEndSeq < 2; ++deltaEndSeq)
385 auto const result = env.rpc(
393 result[jss::result][jss::status] == jss::error &&
394 result[jss::result][jss::error] == NOT_FOUND);
395 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
401 auto const result = env.rpc(
405 result[jss::result][jss::status] == jss::error &&
406 result[jss::result][jss::error] == NOT_FOUND);
408 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
414 auto const result = env.rpc(
421 result[jss::result][jss::status] == jss::error &&
422 result[jss::result][jss::error] == NOT_FOUND);
424 BEAST_EXPECT(!result[jss::result][jss::searched_all].asBool());
430 auto const& meta = metas[0];
431 uint32_t txnIdx = meta->getFieldU32(sfTransactionIndex);
432 auto const result = env.rpc(
438 BEAST_EXPECT(result[jss::result][jss::status] == jss::success);
439 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
444 auto const result = env.rpc(
452 result[jss::result][jss::status] == jss::error &&
453 result[jss::result][jss::error] ==
INVALID);
455 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
460 auto const result = env.rpc(
468 result[jss::result][jss::status] == jss::error &&
469 result[jss::result][jss::error] ==
INVALID);
471 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
480 result[jss::result][jss::status] == jss::error &&
481 result[jss::result][jss::error] ==
INVALID);
483 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
488 auto const result = env.rpc(COMMAND, ctid, BINARY,
to_string(20));
491 result[jss::result][jss::status] == jss::error &&
492 result[jss::result][jss::error] ==
INVALID);
494 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
499 auto const result = env.rpc(COMMAND, ctid,
to_string(20));
506 BEAST_EXPECT(result[jss::result][jss::status] == jss::error);
508 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
513 auto const result = env.rpc(
521 result[jss::result][jss::status] == jss::error &&
522 result[jss::result][jss::error] == EXCESSIVE);
524 BEAST_EXPECT(!result[jss::result].isMember(jss::searched_all));
533 using namespace test::jtx;
547 BEAST_EXPECT(
RPC::encodeCTID(13249191UL, 12911U, 65535U) == expected14);
559 auto const expected51 =
563 auto const expected52 =
567 auto const expected53 =
622 using namespace test::jtx;
625 for (uint32_t netID : {11111, 65535, 65536})
628 BEAST_EXPECT(netID == env.app().config().NETWORK_ID);
630 auto const alice = Account(
"alice");
631 auto const bob = Account(
"bob");
633 auto const startLegSeq = env.current()->info().seq;
634 env.fund(XRP(10000), alice, bob);
635 env(pay(alice, bob, XRP(10)));
647 jsonTx[jss::binary] =
false;
648 jsonTx[jss::ctid] = *ctid;
651 env.rpc(
"json",
"tx",
to_string(jsonTx))[jss::result];
652 BEAST_EXPECT(jrr[jss::ctid] == ctid);
653 BEAST_EXPECT(jrr.isMember(jss::hash));
661 Account
const alice = Account(
"alice");
662 Account
const bob = Account(
"bob");
665 env.fund(XRP(10000), alice, bob);
666 env(pay(alice, bob, XRP(10)));
670 auto isUpper = [](
char c) {
return std::isupper(c) != 0; };
681 mixedCase.
begin(), mixedCase.
end(), isUpper);
682 *iter = std::tolower(*iter);
684 BEAST_EXPECT(ctid != mixedCase);
687 jsonTx[jss::binary] =
false;
688 jsonTx[jss::ctid] = mixedCase;
691 env.rpc(
"json",
"tx",
to_string(jsonTx))[jss::result];
692 BEAST_EXPECT(jrr[jss::ctid] == ctid);
693 BEAST_EXPECT(jrr[jss::hash]);
700 for (uint32_t netID : {2, 1024, 65535, 65536})
703 BEAST_EXPECT(netID == env.app().config().NETWORK_ID);
705 auto const alice = Account(
"alice");
706 auto const bob = Account(
"bob");
708 env.fund(XRP(10000), alice, bob);
709 env(pay(alice, bob, XRP(10)));
712 auto const ledgerSeq = env.current()->info().seq;
720 params[jss::transaction] = hash;
722 env.rpc(
"json",
"tx",
to_string(params))[jss::result];
723 BEAST_EXPECT(jrr[jss::hash] == hash);
725 BEAST_EXPECT(jrr.isMember(jss::ctid) == (netID <= 0xFFFF));
726 if (jrr.isMember(jss::ctid))
729 BEAST_EXPECT(jrr[jss::ctid] == *ctid);
736 uint32_t netID = env.app().config().NETWORK_ID;
738 auto const alice = Account(
"alice");
739 auto const bob = Account(
"bob");
741 auto const startLegSeq = env.current()->info().seq;
742 env.fund(XRP(10000), alice, bob);
743 env(pay(alice, bob, XRP(10)));
748 jsonTx[jss::binary] =
false;
749 jsonTx[jss::ctid] = ctid;
752 env.rpc(
"json",
"tx",
to_string(jsonTx))[jss::result];
753 BEAST_EXPECT(jrr[jss::error] ==
"wrongNetwork");
756 jrr[jss::error_message] ==
757 "Wrong network. You should submit this request to a node "
758 "running on NetworkID: 21338");
767 using namespace test::jtx;
771 cfg->FEES.reference_fee = 10;
774 Account
const alice{
"alice"};
775 Account
const alie{
"alie"};
776 Account
const gw{
"gw"};
777 auto const USD{gw[
"USD"]};
779 env.fund(XRP(1000000), alice, gw);
786 env(pay(alice, gw, XRP(100)));
791 env.closed()->txRead(env.tx()->getTransactionID()).second;
794 expected[jss::DeliverMax] = expected[jss::Amount];
801 Json::Value const result = {[&env, txn, apiVersion]() {
803 params[jss::transaction] =
to_string(txn->getTransactionID());
804 params[jss::binary] =
false;
805 params[jss::api_version] = apiVersion;
806 return env.client().invoke(
"tx", params);
809 BEAST_EXPECT(result[jss::result][jss::status] == jss::success);
813 result[jss::result][jss::close_time_iso] ==
814 "2000-01-01T00:00:20Z");
816 result[jss::result][jss::hash] ==
818 BEAST_EXPECT(result[jss::result][jss::validated] ==
true);
819 BEAST_EXPECT(result[jss::result][jss::ledger_index] == 4);
821 result[jss::result][jss::ledger_hash] ==
822 "B41882E20F0EC6228417D28B9AE0F33833645D35F6799DFB782AC97FC4BB51"
826 for (
auto memberIt = expected.
begin(); memberIt != expected.
end();
830 auto const& result_transaction =
831 (apiVersion > 1 ? result[jss::result][jss::tx_json]
832 : result[jss::result]);
833 if (BEAST_EXPECT(result_transaction.isMember(name)))
835 auto const received = result_transaction[name];
837 received == *memberIt,
838 "Transaction contains \n\"" + name +
"\": "
852 using namespace test::jtx;
856 cfg->FEES.reference_fee = 10;
859 Account
const alice{
"alice"};
860 Account
const gw{
"gw"};
861 auto const USD{gw[
"USD"]};
863 env.fund(XRP(1000000), alice, gw);
867 "3F8BDE5A5F82C4F4708E5E9255B713E303E6E1A371FD5C7A704AFD1387C23981");
870 env.closed()->txRead(txn->getTransactionID()).second;
875 Json::Value const result = [&env, txn, apiVersion]() {
877 params[jss::transaction] =
to_string(txn->getTransactionID());
878 params[jss::binary] =
true;
879 params[jss::api_version] = apiVersion;
880 return env.client().invoke(
"tx", params);
883 if (BEAST_EXPECT(result[jss::status] ==
"success"))
885 BEAST_EXPECT(result[jss::result][jss::status] ==
"success");
886 BEAST_EXPECT(result[jss::result][jss::validated] ==
true);
888 result[jss::result][jss::hash] ==
890 BEAST_EXPECT(result[jss::result][jss::ledger_index] == 3);
891 BEAST_EXPECT(result[jss::result][jss::ctid] ==
"C000000300030000");
896 result[jss::result][jss::tx_blob] == expected_tx_blob);
898 result[jss::result][jss::meta_blob] == expected_meta_blob);
900 result[jss::result][jss::ledger_hash] ==
901 "2D5150E5A5AA436736A732291E437ABF01BC9E206C2DF3C77C4F856915"
904 result[jss::result][jss::close_time_iso] ==
905 "2000-01-01T00:00:10Z");
909 BEAST_EXPECT(result[jss::result][jss::tx] == expected_tx_blob);
911 result[jss::result][jss::meta] == expected_meta_blob);
912 BEAST_EXPECT(result[jss::result][jss::date] == 10);