19 #include <ripple/beast/unit_test.h>
20 #include <ripple/protocol/SField.h>
21 #include <ripple/protocol/jss.h>
25 #include <ripple/rpc/GRPCHandlers.h>
26 #include <ripple/rpc/impl/RPCHelpers.h>
27 #include <test/rpc/GRPCTestClientBase.h>
37 tx[jss::tx][jss::Sequence].asInt() == sequence &&
38 tx[jss::tx][jss::ledger_index].asInt() == ledger);
52 jvc[jss::account] = account.human();
53 jvc[jss::ledger_index_min] = ledger_min;
54 jvc[jss::ledger_index_max] = ledger_max;
55 jvc[jss::forward] = forward;
56 jvc[jss::limit] = limit;
58 jvc[jss::marker] = marker;
60 return env.
rpc(
"json",
"account_tx",
to_string(jvc))[jss::result];
66 testcase(
"Paging for Single Account");
67 using namespace test::jtx;
74 env.fund(XRP(10000), A1, A2, A3);
77 env.trust(A3[
"USD"](1000), A1);
78 env.trust(A2[
"USD"](1000), A1);
79 env.trust(A3[
"USD"](1000), A2);
82 for (
auto i = 0; i < 5; ++i)
84 env(pay(A2, A1, A2[
"USD"](2)));
85 env(pay(A3, A1, A3[
"USD"](2)));
86 env(offer(A1, XRP(11), A1[
"USD"](1)));
87 env(offer(A2, XRP(10), A2[
"USD"](1)));
88 env(offer(A3, XRP(9), A3[
"USD"](1)));
113 auto jrr =
next(env, A3, 2, 5, 2,
true);
114 auto txs = jrr[jss::transactions];
115 if (!BEAST_EXPECT(txs.isArray() && txs.size() == 2))
119 if (!BEAST_EXPECT(jrr[jss::marker]))
122 jrr =
next(env, A3, 2, 5, 2,
true, jrr[jss::marker]);
123 txs = jrr[jss::transactions];
124 if (!BEAST_EXPECT(txs.isArray() && txs.size() == 2))
128 if (!BEAST_EXPECT(jrr[jss::marker]))
131 jrr =
next(env, A3, 2, 5, 2,
true, jrr[jss::marker]);
132 txs = jrr[jss::transactions];
133 if (!BEAST_EXPECT(txs.isArray() && txs.size() == 2))
137 BEAST_EXPECT(!jrr[jss::marker]);
142 auto jrr =
next(env, A3, 3, 9, 1,
true);
143 auto txs = jrr[jss::transactions];
144 if (!BEAST_EXPECT(txs.isArray() && txs.size() == 1))
147 if (!BEAST_EXPECT(jrr[jss::marker]))
150 jrr =
next(env, A3, 3, 9, 1,
true, jrr[jss::marker]);
151 txs = jrr[jss::transactions];
152 if (!BEAST_EXPECT(txs.isArray() && txs.size() == 1))
155 if (!BEAST_EXPECT(jrr[jss::marker]))
158 jrr =
next(env, A3, 3, 9, 1,
true, jrr[jss::marker]);
159 txs = jrr[jss::transactions];
160 if (!BEAST_EXPECT(txs.isArray() && txs.size() == 1))
163 if (!BEAST_EXPECT(jrr[jss::marker]))
167 jrr =
next(env, A3, 3, 9, 3,
true, jrr[jss::marker]);
168 txs = jrr[jss::transactions];
169 if (!BEAST_EXPECT(txs.isArray() && txs.size() == 3))
174 if (!BEAST_EXPECT(jrr[jss::marker]))
177 jrr =
next(env, A3, 3, 9, 3,
true, jrr[jss::marker]);
178 txs = jrr[jss::transactions];
179 if (!BEAST_EXPECT(txs.isArray() && txs.size() == 3))
184 if (!BEAST_EXPECT(jrr[jss::marker]))
187 jrr =
next(env, A3, 3, 9, 3,
true, jrr[jss::marker]);
188 txs = jrr[jss::transactions];
189 if (!BEAST_EXPECT(txs.isArray() && txs.size() == 3))
194 if (!BEAST_EXPECT(jrr[jss::marker]))
197 jrr =
next(env, A3, 3, 9, 3,
true, jrr[jss::marker]);
198 txs = jrr[jss::transactions];
199 if (!BEAST_EXPECT(txs.isArray() && txs.size() == 2))
203 BEAST_EXPECT(!jrr[jss::marker]);
208 auto jrr =
next(env, A3, 3, 9, 2,
false);
209 auto txs = jrr[jss::transactions];
210 if (!BEAST_EXPECT(txs.isArray() && txs.size() == 2))
214 if (!BEAST_EXPECT(jrr[jss::marker]))
217 jrr =
next(env, A3, 3, 9, 2,
false, jrr[jss::marker]);
218 txs = jrr[jss::transactions];
219 if (!BEAST_EXPECT(txs.isArray() && txs.size() == 2))
223 if (!BEAST_EXPECT(jrr[jss::marker]))
227 jrr =
next(env, A3, 3, 9, 3,
false, jrr[jss::marker]);
228 txs = jrr[jss::transactions];
229 if (!BEAST_EXPECT(txs.isArray() && txs.size() == 3))
234 if (!BEAST_EXPECT(jrr[jss::marker]))
237 jrr =
next(env, A3, 3, 9, 3,
false, jrr[jss::marker]);
238 txs = jrr[jss::transactions];
239 if (!BEAST_EXPECT(txs.isArray() && txs.size() == 3))
244 if (!BEAST_EXPECT(jrr[jss::marker]))
247 jrr =
next(env, A3, 3, 9, 3,
false, jrr[jss::marker]);
248 txs = jrr[jss::transactions];
249 if (!BEAST_EXPECT(txs.isArray() && txs.size() == 3))
254 if (!BEAST_EXPECT(jrr[jss::marker]))
257 jrr =
next(env, A3, 3, 9, 3,
false, jrr[jss::marker]);
258 txs = jrr[jss::transactions];
259 if (!BEAST_EXPECT(txs.isArray() && txs.size() == 1))
262 BEAST_EXPECT(!jrr[jss::marker]);
269 org::xrpl::rpc::v1::GetAccountTransactionHistoryRequest
request;
270 org::xrpl::rpc::v1::GetAccountTransactionHistoryResponse
reply;
287 org::xrpl::rpc::v1::GetTransactionResponse
const& tx,
292 tx.transaction().sequence().value() == sequence &&
293 tx.ledger_index() == ledger);
297 org::xrpl::rpc::v1::GetAccountTransactionHistoryResponse,
306 bool forward =
false,
307 org::xrpl::rpc::v1::Marker* marker =
nullptr)
310 auto& request = client.request;
312 request.mutable_account()->set_address(account);
313 if (ledger_min != -1)
314 request.mutable_ledger_range()->set_ledger_index_min(ledger_min);
315 if (ledger_max != -1)
316 request.mutable_ledger_range()->set_ledger_index_max(ledger_max);
317 request.set_forward(forward);
318 request.set_binary(
true);
320 request.set_limit(limit);
323 *request.mutable_marker() = *marker;
327 return {client.reply, client.status};
331 org::xrpl::rpc::v1::GetAccountTransactionHistoryResponse,
340 bool forward =
false,
341 org::xrpl::rpc::v1::Marker* marker =
nullptr)
344 auto& request = client.request;
346 request.mutable_account()->set_address(account);
347 if (ledger_min != -1)
348 request.mutable_ledger_range()->set_ledger_index_min(ledger_min);
349 if (ledger_max != -1)
350 request.mutable_ledger_range()->set_ledger_index_max(ledger_max);
351 request.set_forward(forward);
353 request.set_limit(limit);
356 *request.mutable_marker() = *marker;
360 return {client.reply, client.status};
364 org::xrpl::rpc::v1::GetAccountTransactionHistoryResponse,
372 bool forward =
false,
373 org::xrpl::rpc::v1::Marker* marker =
nullptr)
376 auto& request = client.request;
378 request.mutable_account()->set_address(account);
379 if (ledger_seq != -1)
380 request.mutable_ledger_specifier()->set_sequence(ledger_seq);
381 request.set_forward(forward);
383 request.set_limit(limit);
386 *request.mutable_marker() = *marker;
390 return {client.reply, client.status};
394 org::xrpl::rpc::v1::GetAccountTransactionHistoryResponse,
400 uint256 const& hash = beast::zero,
402 bool forward =
false,
403 org::xrpl::rpc::v1::Marker* marker =
nullptr)
406 auto& request = client.request;
408 request.mutable_account()->set_address(account);
409 if (hash != beast::zero)
410 request.mutable_ledger_specifier()->set_hash(
411 hash.data(), hash.size());
412 request.set_forward(forward);
414 request.set_limit(limit);
417 *request.mutable_marker() = *marker;
421 return {client.reply, client.status};
427 testcase(
"Test Account_tx Grpc");
429 using namespace test::jtx;
432 Env env(*
this, std::move(config));
435 env.fund(XRP(10000), A1);
441 auto hasTxs = [](
auto res) {
442 return res.second.error_code() == 0 &&
443 (res.first.transactions().size() == 2) &&
445 (res.first.transactions()[1u].transaction().has_payment());
447 auto noTxs = [](
auto res) {
448 return res.second.error_code() == 0 &&
449 (res.first.transactions().size() == 0);
452 auto isErr = [](
auto res,
auto expect) {
453 return res.second.error_code() == expect;
457 isErr(
next(grpcPort, env,
""), grpc::StatusCode::INVALID_ARGUMENT));
460 next(grpcPort, env,
"0xDEADBEEF"),
461 grpc::StatusCode::INVALID_ARGUMENT));
463 BEAST_EXPECT(hasTxs(
next(grpcPort, env, A1.human())));
467 BEAST_EXPECT(hasTxs(
next(grpcPort, env, A1.human())));
469 BEAST_EXPECT(hasTxs(
next(grpcPort, env, A1.human(), 0, 100)));
471 BEAST_EXPECT(noTxs(
next(grpcPort, env, A1.human(), 1, 2)));
474 next(grpcPort, env, A1.human(), 2, 1),
475 grpc::StatusCode::INVALID_ARGUMENT));
480 BEAST_EXPECT(hasTxs(
next(grpcPort, env, A1.human(), -1)));
482 BEAST_EXPECT(hasTxs(
next(grpcPort, env, A1.human(), 1)));
485 next(grpcPort, env, A1.human(), env.current()->info().seq),
486 grpc::StatusCode::INVALID_ARGUMENT));
491 BEAST_EXPECT(hasTxs(
next(grpcPort, env, A1.human(), -1, -1)));
493 BEAST_EXPECT(hasTxs(
next(
494 grpcPort, env, A1.human(), -1, env.current()->info().seq)));
497 next(grpcPort, env, A1.human(), -1, env.closed()->info().seq)));
499 BEAST_EXPECT(noTxs(
next(
500 grpcPort, env, A1.human(), -1, env.closed()->info().seq - 1)));
505 grpcPort, env, A1.human(), env.closed()->info().seq)));
508 grpcPort, env, A1.human(), env.closed()->info().seq - 1)));
512 grpcPort, env, A1.human(), env.current()->info().seq),
513 grpc::StatusCode::INVALID_ARGUMENT));
517 grpcPort, env, A1.human(), env.current()->info().seq + 1),
518 grpc::StatusCode::NOT_FOUND));
524 grpcPort, env, A1.human(), env.closed()->info().hash)));
527 grpcPort, env, A1.human(), env.closed()->info().parentHash)));
536 std::function<bool(org::xrpl::rpc::v1::Transaction
const& res)>
543 testcase(
"Test AccountTx context grpc");
546 using namespace test::jtx;
547 using namespace std::chrono_literals;
551 Env env(*
this, std::move(config));
554 Account
const alice{
"alice"};
555 Account
const alie{
"alie"};
556 Account
const gw{
"gw"};
557 auto const USD{gw[
"USD"]};
561 env.fund(XRP(1000000), alice, gw);
569 env(pay(alice, gw, XRP(100)), stag(42), dtag(24), last_ledger_seq(20));
573 env(regkey(alice, alie));
578 env(trust(alice, USD(200)), sig(alie));
582 env(offer(alice, USD(50), XRP(150)), sig(alie));
589 cancelOffer[jss::Account] = alice.human();
590 cancelOffer[jss::OfferSequence] = offerSeq;
591 cancelOffer[jss::TransactionType] = jss::OfferCancel;
592 env(cancelOffer, sig(alie));
599 env(signers(alice, 1, {{
"bogie", 1}, {
"demon", 1}, {gw, 1}}),
606 auto escrow = [](Account
const& account,
610 escro[jss::TransactionType] = jss::EscrowCreate;
612 escro[jss::Account] = account.human();
613 escro[jss::Destination] = to.human();
620 Json::Value escrowWithFinish{escrow(alice, alice, XRP(500))};
622 nextTime.time_since_epoch().count();
625 env(escrowWithFinish, sig(alie));
628 Json::Value escrowWithCancel{escrow(alice, alice, XRP(500))};
630 nextTime.time_since_epoch().count();
632 nextTime.time_since_epoch().count() + 1;
635 env(escrowWithCancel, sig(alie));
641 escrowFinish[jss::TransactionType] = jss::EscrowFinish;
643 escrowFinish[jss::Account] = alice.human();
646 env(escrowFinish, sig(alie));
652 escrowCancel[jss::TransactionType] = jss::EscrowCancel;
654 escrowCancel[jss::Account] = alice.human();
657 env(escrowCancel, sig(alie));
668 payChanCreate[jss::TransactionType] = jss::PaymentChannelCreate;
670 payChanCreate[jss::Account] = alice.human();
671 payChanCreate[jss::Destination] = gw.human();
672 payChanCreate[jss::Amount] =
677 env(payChanCreate, sig(alie));
686 payChanFund[jss::TransactionType] = jss::PaymentChannelFund;
688 payChanFund[jss::Account] = alice.human();
690 payChanFund[jss::Amount] =
692 env(payChanFund, sig(alie));
699 payChanClaim[jss::TransactionType] = jss::PaymentChannelClaim;
700 payChanClaim[jss::Flags] =
tfClose;
701 payChanClaim[jss::Account] = gw.human();
714 env(check::create(alice, gw, XRP(300)), sig(alie));
718 env(check::create(gw, alice, XRP(200)));
726 env(check::cash(alice, gwCheckId, XRP(200)), sig(alie));
729 env(check::cancel(alice, aliceCheckId), sig(alie));
736 env(deposit::auth(alice, gw), sig(alie));
741 auto const baseFee = env.current()->fees().base;
745 memo(
"data",
"format",
"type"));
749 if (!BEAST_EXPECT(txns.
size() == 20))
753 static const TxCheck txCheck[]{
756 strHex(txns[txns.
size() - 1]->getTransactionID()),
757 [
this, &txns](
auto res) {
760 return BEAST_EXPECT(res.has_account_set()) &&
761 BEAST_EXPECT(res.has_fee()) &&
762 BEAST_EXPECT(res.fee().drops() == 20) &&
763 BEAST_EXPECT(res.memos_size() == 1) &&
764 BEAST_EXPECT(res.memos(0).has_memo_data()) &&
765 BEAST_EXPECT(res.memos(0).memo_data().value() ==
"data") &&
766 BEAST_EXPECT(res.memos(0).has_memo_format()) &&
768 res.memos(0).memo_format().value() ==
"format") &&
769 BEAST_EXPECT(res.memos(0).has_memo_type()) &&
770 BEAST_EXPECT(res.memos(0).memo_type().value() ==
"type") &&
771 BEAST_EXPECT(res.has_signing_public_key()) &&
772 BEAST_EXPECT(res.signing_public_key().value() ==
"") &&
773 BEAST_EXPECT(res.signers_size() == 1) &&
774 BEAST_EXPECT(res.signers(0).has_account()) &&
776 res.signers(0).account().value().address() ==
777 txnJson[
"Signers"][0u][
"Signer"][
"Account"]) &&
778 BEAST_EXPECT(res.signers(0).has_transaction_signature()) &&
781 .transaction_signature()
783 txnJson[
"Signers"][0u][
"Signer"][
"TxnSignature"]) &&
784 BEAST_EXPECT(res.signers(0).has_signing_public_key()) &&
787 res.signers(0).signing_public_key().value()) ==
788 txnJson[
"Signers"][0u][
"Signer"][
"SigningPubKey"]);
792 strHex(txns[txns.
size() - 2]->getTransactionID()),
793 [&txns,
this](
auto res) {
794 return BEAST_EXPECT(res.has_deposit_preauth()) &&
796 res.deposit_preauth()
801 txns[txns.
size() - 2]->getJson(
806 strHex(txns[txns.
size() - 3]->getTransactionID()),
807 [&txns,
this](
auto res) {
808 return BEAST_EXPECT(res.has_check_cancel()) &&
810 strHex(res.check_cancel().check_id().value()) ==
812 txns[txns.
size() - 3]->getJson(
817 strHex(txns[txns.
size() - 4]->getTransactionID()),
818 [&txns,
this](
auto res) {
821 return BEAST_EXPECT(res.has_check_cash()) &&
823 strHex(res.check_cash().check_id().value()) ==
824 txnJson[
"CheckID"]) &&
825 BEAST_EXPECT(res.check_cash()
828 .has_xrp_amount()) &&
834 .drops() == txnJson[
"Amount"].asUInt());
838 strHex(txns[txns.
size() - 5]->getTransactionID()),
839 [&txns,
this](
auto res) {
842 return BEAST_EXPECT(res.has_check_create()) &&
847 .address() == txnJson[
"Destination"]) &&
848 BEAST_EXPECT(res.check_create()
851 .has_xrp_amount()) &&
857 .drops() == txnJson[
"SendMax"].asUInt());
861 strHex(txns[txns.
size() - 6]->getTransactionID()),
862 [&txns,
this](
auto res) {
865 return BEAST_EXPECT(res.has_check_create()) &&
870 .address() == txnJson[
"Destination"]) &&
871 BEAST_EXPECT(res.check_create()
874 .has_xrp_amount()) &&
882 txnJson[
"SendMax"].asUInt());
886 strHex(txns[txns.
size() - 7]->getTransactionID()),
887 [&txns,
this](
auto res) {
890 return BEAST_EXPECT(res.has_payment_channel_claim()) &&
892 strHex(res.payment_channel_claim()
894 .value()) == txnJson[
"Channel"]) &&
896 strHex(res.payment_channel_claim()
898 .value()) == txnJson[
"PublicKey"]);
902 strHex(txns[txns.
size() - 8]->getTransactionID()),
903 [&txns,
this](
auto res) {
906 return BEAST_EXPECT(res.has_payment_channel_fund()) &&
909 res.payment_channel_fund().channel().value()) ==
910 txnJson[
"Channel"]) &&
911 BEAST_EXPECT(res.payment_channel_fund()
914 .has_xrp_amount()) &&
916 res.payment_channel_fund()
920 .drops() == txnJson[
"Amount"].asUInt());
924 strHex(txns[txns.
size() - 9]->getTransactionID()),
925 [&txns,
this](
auto res) {
928 return BEAST_EXPECT(res.has_payment_channel_create()) &&
929 BEAST_EXPECT(res.payment_channel_create()
932 .has_xrp_amount()) &&
934 res.payment_channel_create()
938 .drops() == txnJson[
"Amount"].asUInt()) &&
940 res.payment_channel_create()
943 .address() == txnJson[
"Destination"]) &&
945 res.payment_channel_create()
947 .value() == txnJson[
"SettleDelay"].asUInt()) &&
949 strHex(res.payment_channel_create()
951 .value()) == txnJson[
"PublicKey"]);
955 strHex(txns[txns.
size() - 10]->getTransactionID()),
956 [&txns,
this](
auto res) {
959 return BEAST_EXPECT(res.has_escrow_cancel()) &&
961 res.escrow_cancel().owner().value().address() ==
964 res.escrow_cancel().offer_sequence().value() ==
965 txnJson[
"OfferSequence"].asUInt()
971 strHex(txns[txns.
size() - 11]->getTransactionID()),
972 [&txns,
this](
auto res) {
975 return BEAST_EXPECT(res.has_escrow_finish()) &&
977 res.escrow_finish().owner().value().address() ==
980 res.escrow_finish().offer_sequence().value() ==
981 txnJson[
"OfferSequence"].asUInt()
987 strHex(txns[txns.
size() - 12]->getTransactionID()),
988 [&txns,
this](
auto res) {
991 return BEAST_EXPECT(res.has_escrow_create()) &&
992 BEAST_EXPECT(res.escrow_create()
995 .has_xrp_amount()) &&
1001 .drops() == txnJson[
"Amount"].asUInt()) &&
1006 .address() == txnJson[
"Destination"]) &&
1008 res.escrow_create().cancel_after().value() ==
1009 txnJson[
"CancelAfter"].asUInt()) &&
1011 res.escrow_create().finish_after().value() ==
1012 txnJson[
"FinishAfter"].asUInt());
1016 strHex(txns[txns.
size() - 13]->getTransactionID()),
1017 [&txns,
this](
auto res) {
1020 return BEAST_EXPECT(res.has_escrow_create()) &&
1021 BEAST_EXPECT(res.escrow_create()
1024 .has_xrp_amount()) &&
1030 .drops() == txnJson[
"Amount"].asUInt()) &&
1035 .address() == txnJson[
"Destination"]) &&
1037 res.escrow_create().finish_after().value() ==
1038 txnJson[
"FinishAfter"].asUInt());
1042 strHex(txns[txns.
size() - 14]->getTransactionID()),
1043 [&txns,
this](
auto res) {
1046 return BEAST_EXPECT(res.has_signer_list_set()) &&
1048 res.signer_list_set().signer_quorum().value() ==
1049 txnJson[
"SignerQuorum"].asUInt()) &&
1051 res.signer_list_set().signer_entries().size() ==
1054 res.signer_list_set()
1055 .signer_entries()[0]
1059 txnJson[
"SignerEntries"][0u][
"SignerEntry"]
1062 res.signer_list_set()
1063 .signer_entries()[0]
1066 txnJson[
"SignerEntries"][0u][
"SignerEntry"]
1070 res.signer_list_set()
1071 .signer_entries()[1]
1075 txnJson[
"SignerEntries"][1u][
"SignerEntry"]
1078 res.signer_list_set()
1079 .signer_entries()[1]
1082 txnJson[
"SignerEntries"][1u][
"SignerEntry"]
1086 res.signer_list_set()
1087 .signer_entries()[2]
1091 txnJson[
"SignerEntries"][2u][
"SignerEntry"]
1094 res.signer_list_set()
1095 .signer_entries()[2]
1098 txnJson[
"SignerEntries"][2u][
"SignerEntry"]
1104 strHex(txns[txns.
size() - 15]->getTransactionID()),
1105 [&txns,
this](
auto res) {
1108 return BEAST_EXPECT(res.has_offer_cancel()) &&
1110 res.offer_cancel().offer_sequence().value() ==
1111 txnJson[
"OfferSequence"].asUInt());
1115 strHex(txns[txns.
size() - 16]->getTransactionID()),
1116 [&txns,
this](
auto res) {
1119 return BEAST_EXPECT(res.has_offer_create()) &&
1120 BEAST_EXPECT(res.offer_create()
1123 .has_xrp_amount()) &&
1129 .drops() == txnJson[
"TakerGets"].asUInt()) &&
1130 BEAST_EXPECT(res.offer_create()
1133 .has_issued_currency_amount()) &&
1138 .issued_currency_amount()
1140 .name() == txnJson[
"TakerPays"][
"currency"]) &&
1145 .issued_currency_amount()
1146 .value() == txnJson[
"TakerPays"][
"value"]) &&
1151 .issued_currency_amount()
1153 .address() == txnJson[
"TakerPays"][
"issuer"]);
1157 strHex(txns[txns.
size() - 17]->getTransactionID()),
1158 [&txns,
this](
auto res) {
1161 return BEAST_EXPECT(res.has_trust_set()) &&
1162 BEAST_EXPECT(res.trust_set()
1165 .has_issued_currency_amount()) &&
1170 .issued_currency_amount()
1173 txnJson[
"LimitAmount"][
"currency"]) &&
1178 .issued_currency_amount()
1179 .value() == txnJson[
"LimitAmount"][
"value"]) &&
1184 .issued_currency_amount()
1186 .address() == txnJson[
"LimitAmount"][
"issuer"]);
1190 strHex(txns[txns.
size() - 18]->getTransactionID()),
1191 [&txns,
this](
auto res) {
1194 return BEAST_EXPECT(res.has_set_regular_key()) &&
1196 res.set_regular_key()
1199 .address() == txnJson[
"RegularKey"]);
1203 strHex(txns[txns.
size() - 19]->getTransactionID()),
1204 [&txns,
this](
auto res) {
1207 return BEAST_EXPECT(res.has_payment()) &&
1209 res.payment().amount().value().has_xrp_amount()) &&
1215 .drops() == txnJson[
"Amount"].asUInt()) &&
1217 res.payment().destination().value().address() ==
1218 txnJson[
"Destination"]) &&
1219 BEAST_EXPECT(res.has_source_tag()) &&
1221 res.source_tag().value() ==
1222 txnJson[
"SourceTag"].asUInt()) &&
1223 BEAST_EXPECT(res.payment().has_destination_tag()) &&
1225 res.payment().destination_tag().value() ==
1226 txnJson[
"DestinationTag"].asUInt()) &&
1227 BEAST_EXPECT(res.has_last_ledger_sequence()) &&
1229 res.last_ledger_sequence().value() ==
1230 txnJson[
"LastLedgerSequence"].asUInt()) &&
1231 BEAST_EXPECT(res.has_transaction_signature()) &&
1232 BEAST_EXPECT(res.has_account()) &&
1234 res.account().value().address() ==
1235 txnJson[
"Account"]) &&
1236 BEAST_EXPECT(res.has_flags()) &&
1238 res.flags().value() == txnJson[
"Flags"].asUInt());
1242 strHex(txns[txns.
size() - 20]->getTransactionID()),
1243 [
this](
auto res) {
return BEAST_EXPECT(res.has_account_set()); }},
1246 "9CE54C3B934E473A995B477E92EC229F99CED5B62BF4D2ACE4DC42719103AE2F",
1248 return BEAST_EXPECT(res.has_account_set()) &&
1249 BEAST_EXPECT(res.account_set().set_flag().value() == 8);
1253 "2B5054734FA43C6C7B54F61944FAD6178ACD5D0272B39BA7FCD32A5D3932FBFF",
1254 [&alice,
this](
auto res) {
1255 return BEAST_EXPECT(res.has_payment()) &&
1257 res.payment().amount().value().has_xrp_amount()) &&
1263 .drops() == 1000000000010) &&
1265 res.payment().destination().value().address() ==
1271 static const MetaCheck txMetaCheck[]{
1272 {[
this](
auto meta) {
1273 return BEAST_EXPECT(meta.transaction_index() == 0) &&
1274 BEAST_EXPECT(meta.affected_nodes_size() == 1) &&
1277 meta.affected_nodes().begin(),
1278 meta.affected_nodes().end(),
1279 [](org::xrpl::rpc::v1::AffectedNode
const&
1281 return entry.ledger_entry_type() ==
1282 org::xrpl::rpc::v1::LedgerEntryType::
1283 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1286 {[
this](
auto meta) {
1287 return BEAST_EXPECT(meta.transaction_index() == 0) &&
1288 BEAST_EXPECT(meta.affected_nodes_size() == 3) &&
1291 meta.affected_nodes().begin(),
1292 meta.affected_nodes().end(),
1294 return entry.ledger_entry_type() ==
1295 org::xrpl::rpc::v1::LedgerEntryType::
1296 LEDGER_ENTRY_TYPE_DEPOSIT_PREAUTH;
1300 meta.affected_nodes().begin(),
1302 meta.affected_nodes().end(),
1304 return entry.ledger_entry_type() ==
1305 org::xrpl::rpc::v1::LedgerEntryType::
1306 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1310 meta.affected_nodes().begin(),
1311 meta.affected_nodes().end(),
1313 return entry.ledger_entry_type() ==
1314 org::xrpl::rpc::v1::LedgerEntryType::
1315 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1318 {[
this](
auto meta) {
1319 return BEAST_EXPECT(meta.transaction_index() == 1) &&
1320 BEAST_EXPECT(meta.affected_nodes_size() == 5) &&
1323 meta.affected_nodes().begin(),
1324 meta.affected_nodes().end(),
1326 return entry.ledger_entry_type() ==
1327 org::xrpl::rpc::v1::LedgerEntryType::
1328 LEDGER_ENTRY_TYPE_CHECK;
1332 meta.affected_nodes().begin(),
1333 meta.affected_nodes().end(),
1335 return entry.ledger_entry_type() ==
1336 org::xrpl::rpc::v1::LedgerEntryType::
1337 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1341 meta.affected_nodes().begin(),
1342 meta.affected_nodes().end(),
1344 return entry.ledger_entry_type() ==
1345 org::xrpl::rpc::v1::LedgerEntryType::
1346 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1349 {[
this](
auto meta) {
1350 return BEAST_EXPECT(meta.transaction_index() == 0) &&
1351 BEAST_EXPECT(meta.affected_nodes_size() == 5) &&
1354 meta.affected_nodes().begin(),
1355 meta.affected_nodes().end(),
1357 return entry.ledger_entry_type() ==
1358 org::xrpl::rpc::v1::LedgerEntryType::
1359 LEDGER_ENTRY_TYPE_CHECK;
1363 meta.affected_nodes().begin(),
1364 meta.affected_nodes().end(),
1366 return entry.ledger_entry_type() ==
1367 org::xrpl::rpc::v1::LedgerEntryType::
1368 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1372 meta.affected_nodes().begin(),
1373 meta.affected_nodes().end(),
1375 return entry.ledger_entry_type() ==
1376 org::xrpl::rpc::v1::LedgerEntryType::
1377 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1380 {[
this](
auto meta) {
1381 return BEAST_EXPECT(meta.transaction_index() == 1) &&
1382 BEAST_EXPECT(meta.affected_nodes_size() == 5) &&
1385 meta.affected_nodes().begin(),
1386 meta.affected_nodes().end(),
1388 return entry.ledger_entry_type() ==
1389 org::xrpl::rpc::v1::LedgerEntryType::
1390 LEDGER_ENTRY_TYPE_CHECK;
1394 meta.affected_nodes().begin(),
1395 meta.affected_nodes().end(),
1397 return entry.ledger_entry_type() ==
1398 org::xrpl::rpc::v1::LedgerEntryType::
1399 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1403 meta.affected_nodes().begin(),
1404 meta.affected_nodes().end(),
1406 return entry.ledger_entry_type() ==
1407 org::xrpl::rpc::v1::LedgerEntryType::
1408 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1411 {[
this](
auto meta) {
1412 return BEAST_EXPECT(meta.transaction_index() == 0) &&
1413 BEAST_EXPECT(meta.affected_nodes_size() == 5) &&
1416 meta.affected_nodes().begin(),
1417 meta.affected_nodes().end(),
1419 return entry.ledger_entry_type() ==
1420 org::xrpl::rpc::v1::LedgerEntryType::
1421 LEDGER_ENTRY_TYPE_CHECK;
1425 meta.affected_nodes().begin(),
1426 meta.affected_nodes().end(),
1428 return entry.ledger_entry_type() ==
1429 org::xrpl::rpc::v1::LedgerEntryType::
1430 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1434 meta.affected_nodes().begin(),
1435 meta.affected_nodes().end(),
1437 return entry.ledger_entry_type() ==
1438 org::xrpl::rpc::v1::LedgerEntryType::
1439 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1442 {[
this](
auto meta) {
1443 return BEAST_EXPECT(meta.transaction_index() == 0) &&
1444 BEAST_EXPECT(meta.affected_nodes_size() == 5) &&
1447 meta.affected_nodes().begin(),
1448 meta.affected_nodes().end(),
1450 return entry.ledger_entry_type() ==
1451 org::xrpl::rpc::v1::LedgerEntryType::
1452 LEDGER_ENTRY_TYPE_PAY_CHANNEL;
1456 meta.affected_nodes().begin(),
1457 meta.affected_nodes().end(),
1459 return entry.ledger_entry_type() ==
1460 org::xrpl::rpc::v1::LedgerEntryType::
1461 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1465 meta.affected_nodes().begin(),
1466 meta.affected_nodes().end(),
1468 return entry.ledger_entry_type() ==
1469 org::xrpl::rpc::v1::LedgerEntryType::
1470 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1473 {[
this](
auto meta) {
1474 return BEAST_EXPECT(meta.transaction_index() == 0) &&
1475 BEAST_EXPECT(meta.affected_nodes_size() == 2) &&
1479 meta.affected_nodes().begin(),
1480 meta.affected_nodes().end(),
1482 return entry.ledger_entry_type() ==
1483 org::xrpl::rpc::v1::LedgerEntryType::
1484 LEDGER_ENTRY_TYPE_PAY_CHANNEL;
1488 meta.affected_nodes().begin(),
1489 meta.affected_nodes().end(),
1491 return entry.ledger_entry_type() ==
1492 org::xrpl::rpc::v1::LedgerEntryType::
1493 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1496 {[
this](
auto meta) {
1497 return BEAST_EXPECT(meta.transaction_index() == 0) &&
1498 BEAST_EXPECT(meta.affected_nodes_size() == 5) &&
1502 meta.affected_nodes().begin(),
1503 meta.affected_nodes().end(),
1505 return entry.ledger_entry_type() ==
1506 org::xrpl::rpc::v1::LedgerEntryType::
1507 LEDGER_ENTRY_TYPE_PAY_CHANNEL;
1511 meta.affected_nodes().begin(),
1512 meta.affected_nodes().end(),
1514 return entry.ledger_entry_type() ==
1515 org::xrpl::rpc::v1::LedgerEntryType::
1516 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1520 meta.affected_nodes().begin(),
1521 meta.affected_nodes().end(),
1523 return entry.ledger_entry_type() ==
1524 org::xrpl::rpc::v1::LedgerEntryType::
1525 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1528 {[
this](
auto meta) {
1529 return BEAST_EXPECT(meta.transaction_index() == 1) &&
1530 BEAST_EXPECT(meta.affected_nodes_size() == 3) &&
1533 meta.affected_nodes().begin(),
1534 meta.affected_nodes().end(),
1536 return entry.ledger_entry_type() ==
1537 org::xrpl::rpc::v1::LedgerEntryType::
1538 LEDGER_ENTRY_TYPE_ESCROW;
1542 meta.affected_nodes().begin(),
1543 meta.affected_nodes().end(),
1545 return entry.ledger_entry_type() ==
1546 org::xrpl::rpc::v1::LedgerEntryType::
1547 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1551 meta.affected_nodes().begin(),
1552 meta.affected_nodes().end(),
1554 return entry.ledger_entry_type() ==
1555 org::xrpl::rpc::v1::LedgerEntryType::
1556 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1559 {[
this](
auto meta) {
1560 return BEAST_EXPECT(meta.transaction_index() == 0) &&
1561 BEAST_EXPECT(meta.affected_nodes_size() == 3) &&
1564 meta.affected_nodes().begin(),
1565 meta.affected_nodes().end(),
1567 return entry.ledger_entry_type() ==
1568 org::xrpl::rpc::v1::LedgerEntryType::
1569 LEDGER_ENTRY_TYPE_ESCROW;
1573 meta.affected_nodes().begin(),
1574 meta.affected_nodes().end(),
1576 return entry.ledger_entry_type() ==
1577 org::xrpl::rpc::v1::LedgerEntryType::
1578 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1582 meta.affected_nodes().begin(),
1583 meta.affected_nodes().end(),
1585 return entry.ledger_entry_type() ==
1586 org::xrpl::rpc::v1::LedgerEntryType::
1587 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1590 {[
this](
auto meta) {
1591 return BEAST_EXPECT(meta.transaction_index() == 2) &&
1592 BEAST_EXPECT(meta.affected_nodes_size() == 3) &&
1596 meta.affected_nodes().begin(),
1597 meta.affected_nodes().end(),
1599 return entry.ledger_entry_type() ==
1600 org::xrpl::rpc::v1::LedgerEntryType::
1601 LEDGER_ENTRY_TYPE_ESCROW;
1605 meta.affected_nodes().begin(),
1606 meta.affected_nodes().end(),
1608 return entry.ledger_entry_type() ==
1609 org::xrpl::rpc::v1::LedgerEntryType::
1610 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1614 meta.affected_nodes().begin(),
1615 meta.affected_nodes().end(),
1617 return entry.ledger_entry_type() ==
1618 org::xrpl::rpc::v1::LedgerEntryType::
1619 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1622 {[
this](
auto meta) {
1623 return BEAST_EXPECT(meta.transaction_index() == 1) &&
1624 BEAST_EXPECT(meta.affected_nodes_size() == 3) &&
1628 meta.affected_nodes().begin(),
1629 meta.affected_nodes().end(),
1631 return entry.ledger_entry_type() ==
1632 org::xrpl::rpc::v1::LedgerEntryType::
1633 LEDGER_ENTRY_TYPE_ESCROW;
1637 meta.affected_nodes().begin(),
1638 meta.affected_nodes().end(),
1640 return entry.ledger_entry_type() ==
1641 org::xrpl::rpc::v1::LedgerEntryType::
1642 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1646 meta.affected_nodes().begin(),
1647 meta.affected_nodes().end(),
1649 return entry.ledger_entry_type() ==
1650 org::xrpl::rpc::v1::LedgerEntryType::
1651 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1654 {[
this](
auto meta) {
1655 return BEAST_EXPECT(meta.transaction_index() == 0) &&
1656 BEAST_EXPECT(meta.affected_nodes_size() == 3) &&
1659 meta.affected_nodes().begin(),
1660 meta.affected_nodes().end(),
1662 return entry.ledger_entry_type() ==
1663 org::xrpl::rpc::v1::LedgerEntryType::
1664 LEDGER_ENTRY_TYPE_SIGNER_LIST;
1668 meta.affected_nodes().begin(),
1669 meta.affected_nodes().end(),
1671 return entry.ledger_entry_type() ==
1672 org::xrpl::rpc::v1::LedgerEntryType::
1673 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1677 meta.affected_nodes().begin(),
1678 meta.affected_nodes().end(),
1680 return entry.ledger_entry_type() ==
1681 org::xrpl::rpc::v1::LedgerEntryType::
1682 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1685 {[
this](
auto meta) {
1686 return BEAST_EXPECT(meta.transaction_index() == 0) &&
1687 BEAST_EXPECT(meta.affected_nodes_size() == 4) &&
1690 meta.affected_nodes().begin(),
1691 meta.affected_nodes().end(),
1693 return entry.ledger_entry_type() ==
1694 org::xrpl::rpc::v1::LedgerEntryType::
1695 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1699 meta.affected_nodes().begin(),
1700 meta.affected_nodes().end(),
1702 return entry.ledger_entry_type() ==
1703 org::xrpl::rpc::v1::LedgerEntryType::
1704 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1708 meta.affected_nodes().begin(),
1709 meta.affected_nodes().end(),
1711 return entry.ledger_entry_type() ==
1712 org::xrpl::rpc::v1::LedgerEntryType::
1713 LEDGER_ENTRY_TYPE_OFFER;
1716 {[
this](
auto meta) {
1717 return BEAST_EXPECT(meta.transaction_index() == 1) &&
1718 BEAST_EXPECT(meta.affected_nodes_size() == 4) &&
1722 meta.affected_nodes().begin(),
1723 meta.affected_nodes().end(),
1725 return entry.ledger_entry_type() ==
1726 org::xrpl::rpc::v1::LedgerEntryType::
1727 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1731 meta.affected_nodes().begin(),
1732 meta.affected_nodes().end(),
1734 return entry.ledger_entry_type() ==
1735 org::xrpl::rpc::v1::LedgerEntryType::
1736 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1740 meta.affected_nodes().begin(),
1741 meta.affected_nodes().end(),
1743 return entry.ledger_entry_type() ==
1744 org::xrpl::rpc::v1::LedgerEntryType::
1745 LEDGER_ENTRY_TYPE_OFFER;
1748 {[
this](
auto meta) {
1749 return BEAST_EXPECT(meta.transaction_index() == 0) &&
1750 BEAST_EXPECT(meta.affected_nodes_size() == 5) &&
1753 meta.affected_nodes().begin(),
1754 meta.affected_nodes().end(),
1756 return entry.ledger_entry_type() ==
1757 org::xrpl::rpc::v1::LedgerEntryType::
1758 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1762 meta.affected_nodes().begin(),
1763 meta.affected_nodes().end(),
1765 return entry.ledger_entry_type() ==
1766 org::xrpl::rpc::v1::LedgerEntryType::
1767 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1771 meta.affected_nodes().begin(),
1772 meta.affected_nodes().end(),
1774 return entry.ledger_entry_type() ==
1775 org::xrpl::rpc::v1::LedgerEntryType::
1776 LEDGER_ENTRY_TYPE_RIPPLE_STATE;
1779 {[
this](
auto meta) {
1780 return BEAST_EXPECT(meta.transaction_index() == 2) &&
1781 BEAST_EXPECT(meta.affected_nodes_size() == 1) &&
1784 meta.affected_nodes().begin(),
1785 meta.affected_nodes().end(),
1787 return entry.ledger_entry_type() ==
1788 org::xrpl::rpc::v1::LedgerEntryType::
1789 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1792 {[
this](
auto meta) {
1793 return BEAST_EXPECT(meta.transaction_index() == 1) &&
1794 BEAST_EXPECT(meta.affected_nodes_size() == 2) &&
1797 meta.affected_nodes().begin(),
1798 meta.affected_nodes().end(),
1800 return entry.ledger_entry_type() ==
1801 org::xrpl::rpc::v1::LedgerEntryType::
1802 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1805 {[
this](
auto meta) {
1806 return BEAST_EXPECT(meta.transaction_index() == 0) &&
1807 BEAST_EXPECT(meta.affected_nodes_size() == 1) &&
1810 meta.affected_nodes().begin(),
1811 meta.affected_nodes().end(),
1813 return entry.ledger_entry_type() ==
1814 org::xrpl::rpc::v1::LedgerEntryType::
1815 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1818 {[
this](
auto meta) {
1819 return BEAST_EXPECT(meta.transaction_index() == 2) &&
1820 BEAST_EXPECT(meta.affected_nodes_size() == 1) &&
1823 meta.affected_nodes().begin(),
1824 meta.affected_nodes().end(),
1826 return entry.ledger_entry_type() ==
1827 org::xrpl::rpc::v1::LedgerEntryType::
1828 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1831 {[
this](
auto meta) {
1832 return BEAST_EXPECT(meta.transaction_index() == 0) &&
1833 BEAST_EXPECT(meta.affected_nodes_size() == 2) &&
1836 meta.affected_nodes().begin(),
1837 meta.affected_nodes().end(),
1839 return entry.ledger_entry_type() ==
1840 org::xrpl::rpc::v1::LedgerEntryType::
1841 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1845 auto doCheck = [
this](
auto txn,
auto txCheck) {
1846 return BEAST_EXPECT(txn.has_transaction()) &&
1847 BEAST_EXPECT(txn.validated()) &&
1848 BEAST_EXPECT(
strHex(txn.hash()) == txCheck.hash) &&
1849 BEAST_EXPECT(txn.ledger_index() == txCheck.ledgerIndex) &&
1851 txn.transaction().sequence().value() ==
1852 txCheck.sequence) &&
1853 txCheck.checkTxn(txn.transaction());
1856 auto doMetaCheck = [
this](
auto txn,
auto txMetaCheck) {
1857 return BEAST_EXPECT(txn.has_meta()) &&
1858 BEAST_EXPECT(txn.meta().has_transaction_result()) &&
1860 txn.meta().transaction_result().result_type() ==
1861 org::xrpl::rpc::v1::TransactionResult::
1864 txn.meta().transaction_result().result() ==
1866 txMetaCheck(txn.meta());
1869 auto [res, status] =
next(grpcPort, env, alice.human());
1871 if (!BEAST_EXPECT(status.error_code() == 0))
1874 if (!BEAST_EXPECT(res.transactions().size() ==
std::size(txCheck)))
1876 for (
int i = 0; i < res.transactions().size(); ++i)
1878 BEAST_EXPECT(doCheck(res.transactions()[i], txCheck[i]));
1879 BEAST_EXPECT(doMetaCheck(res.transactions()[i], txMetaCheck[i]));
1887 if (!BEAST_EXPECT(res.transactions().size() == txns.
size() + 2))
1891 for (
int i = 0; i < txns.
size(); ++i)
1893 auto toByteString = [](
auto data) {
1894 const char* bytes =
reinterpret_cast<const char*
>(data.data());
1902 BEAST_EXPECT(res.transactions(i).transaction_binary() == bin);
1909 testcase(
"Test Account_tx Grpc");
1911 using namespace test::jtx;
1914 Env env(*
this, std::move(config));
1920 env.fund(XRP(10000), A1, A2, A3);
1923 env.trust(A3[
"USD"](1000), A1);
1924 env.trust(A2[
"USD"](1000), A1);
1925 env.trust(A3[
"USD"](1000), A2);
1928 for (
auto i = 0; i < 5; ++i)
1930 env(pay(A2, A1, A2[
"USD"](2)));
1931 env(pay(A3, A1, A3[
"USD"](2)));
1932 env(offer(A1, XRP(11), A1[
"USD"](1)));
1933 env(offer(A2, XRP(10), A2[
"USD"](1)));
1934 env(offer(A3, XRP(9), A3[
"USD"](1)));
1959 auto [res, status] =
next(grpcPort, env, A3.human(), 2, 5, 2,
true);
1961 auto txs = res.transactions();
1962 if (!BEAST_EXPECT(txs.size() == 2))
1967 if (!BEAST_EXPECT(res.has_marker()))
1971 grpcPort, env, A3.human(), 2, 5, 2,
true, res.mutable_marker());
1972 txs = res.transactions();
1973 if (!BEAST_EXPECT(txs.size() == 2))
1977 if (!BEAST_EXPECT(res.has_marker()))
1981 grpcPort, env, A3.human(), 2, 5, 2,
true, res.mutable_marker());
1982 txs = res.transactions();
1983 if (!BEAST_EXPECT(txs.size() == 2))
1987 BEAST_EXPECT(!res.has_marker());
1993 auto [res, status] =
next(grpcPort, env, A3.human(), 3, 9, 1,
true);
1994 auto txs = res.transactions();
1995 if (!BEAST_EXPECT(txs.size() == 1))
1998 if (!BEAST_EXPECT(res.has_marker()))
2002 grpcPort, env, A3.human(), 3, 9, 1,
true, res.mutable_marker());
2003 txs = res.transactions();
2004 if (!BEAST_EXPECT(txs.size() == 1))
2007 if (!BEAST_EXPECT(res.has_marker()))
2011 grpcPort, env, A3.human(), 3, 9, 1,
true, res.mutable_marker());
2012 txs = res.transactions();
2013 if (!BEAST_EXPECT(txs.size() == 1))
2016 if (!BEAST_EXPECT(res.has_marker()))
2021 grpcPort, env, A3.human(), 3, 9, 3,
true, res.mutable_marker());
2022 txs = res.transactions();
2023 if (!BEAST_EXPECT(txs.size() == 3))
2028 if (!BEAST_EXPECT(res.has_marker()))
2032 grpcPort, env, A3.human(), 3, 9, 3,
true, res.mutable_marker());
2033 txs = res.transactions();
2034 if (!BEAST_EXPECT(txs.size() == 3))
2039 if (!BEAST_EXPECT(res.has_marker()))
2043 grpcPort, env, A3.human(), 3, 9, 3,
true, res.mutable_marker());
2044 txs = res.transactions();
2045 if (!BEAST_EXPECT(txs.size() == 3))
2050 if (!BEAST_EXPECT(res.has_marker()))
2054 grpcPort, env, A3.human(), 3, 9, 3,
true, res.mutable_marker());
2055 txs = res.transactions();
2056 if (!BEAST_EXPECT(txs.size() == 2))
2060 BEAST_EXPECT(!res.has_marker());
2065 auto [res, status] =
2066 next(grpcPort, env, A3.human(), 3, 9, 2,
false);
2067 auto txs = res.transactions();
2068 if (!BEAST_EXPECT(txs.size() == 2))
2072 if (!BEAST_EXPECT(res.has_marker()))
2083 res.mutable_marker());
2084 txs = res.transactions();
2085 if (!BEAST_EXPECT(txs.size() == 2))
2089 if (!BEAST_EXPECT(res.has_marker()))
2101 res.mutable_marker());
2102 txs = res.transactions();
2103 if (!BEAST_EXPECT(txs.size() == 3))
2108 if (!BEAST_EXPECT(res.has_marker()))
2119 res.mutable_marker());
2120 txs = res.transactions();
2121 if (!BEAST_EXPECT(txs.size() == 3))
2126 if (!BEAST_EXPECT(res.has_marker()))
2137 res.mutable_marker());
2138 txs = res.transactions();
2139 if (!BEAST_EXPECT(txs.size() == 3))
2144 if (!BEAST_EXPECT(res.has_marker()))
2155 res.mutable_marker());
2156 txs = res.transactions();
2157 if (!BEAST_EXPECT(txs.size() == 1))
2160 BEAST_EXPECT(!res.has_marker());