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));
587 env(offer_cancel(alice, offerSeq), sig(alie));
593 env(signers(alice, 1, {{
"bogie", 1}, {
"demon", 1}, {gw, 1}}),
600 auto escrow = [](Account
const& account,
604 escro[jss::TransactionType] = jss::EscrowCreate;
606 escro[jss::Account] = account.human();
607 escro[jss::Destination] = to.human();
614 Json::Value escrowWithFinish{escrow(alice, alice, XRP(500))};
616 nextTime.time_since_epoch().count();
619 env(escrowWithFinish, sig(alie));
622 Json::Value escrowWithCancel{escrow(alice, alice, XRP(500))};
624 nextTime.time_since_epoch().count();
626 nextTime.time_since_epoch().count() + 1;
629 env(escrowWithCancel, sig(alie));
635 escrowFinish[jss::TransactionType] = jss::EscrowFinish;
637 escrowFinish[jss::Account] = alice.human();
640 env(escrowFinish, sig(alie));
646 escrowCancel[jss::TransactionType] = jss::EscrowCancel;
648 escrowCancel[jss::Account] = alice.human();
651 env(escrowCancel, sig(alie));
662 payChanCreate[jss::TransactionType] = jss::PaymentChannelCreate;
664 payChanCreate[jss::Account] = alice.human();
665 payChanCreate[jss::Destination] = gw.human();
666 payChanCreate[jss::Amount] =
671 env(payChanCreate, sig(alie));
680 payChanFund[jss::TransactionType] = jss::PaymentChannelFund;
682 payChanFund[jss::Account] = alice.human();
684 payChanFund[jss::Amount] =
686 env(payChanFund, sig(alie));
693 payChanClaim[jss::TransactionType] = jss::PaymentChannelClaim;
694 payChanClaim[jss::Flags] =
tfClose;
695 payChanClaim[jss::Account] = gw.human();
708 env(check::create(alice, gw, XRP(300)), sig(alie));
712 env(check::create(gw, alice, XRP(200)));
720 env(check::cash(alice, gwCheckId, XRP(200)), sig(alie));
723 env(check::cancel(alice, aliceCheckId), sig(alie));
730 env(deposit::auth(alice, gw), sig(alie));
735 auto const baseFee = env.current()->fees().base;
739 memo(
"data",
"format",
"type"));
743 if (!BEAST_EXPECT(txns.
size() == 20))
747 static const TxCheck txCheck[]{
750 strHex(txns[txns.
size() - 1]->getTransactionID()),
751 [
this, &txns](
auto res) {
754 return BEAST_EXPECT(res.has_account_set()) &&
755 BEAST_EXPECT(res.has_fee()) &&
756 BEAST_EXPECT(res.fee().drops() == 20) &&
757 BEAST_EXPECT(res.memos_size() == 1) &&
758 BEAST_EXPECT(res.memos(0).has_memo_data()) &&
759 BEAST_EXPECT(res.memos(0).memo_data().value() ==
"data") &&
760 BEAST_EXPECT(res.memos(0).has_memo_format()) &&
762 res.memos(0).memo_format().value() ==
"format") &&
763 BEAST_EXPECT(res.memos(0).has_memo_type()) &&
764 BEAST_EXPECT(res.memos(0).memo_type().value() ==
"type") &&
765 BEAST_EXPECT(res.has_signing_public_key()) &&
766 BEAST_EXPECT(res.signing_public_key().value() ==
"") &&
767 BEAST_EXPECT(res.signers_size() == 1) &&
768 BEAST_EXPECT(res.signers(0).has_account()) &&
770 res.signers(0).account().value().address() ==
771 txnJson[
"Signers"][0u][
"Signer"][
"Account"]) &&
772 BEAST_EXPECT(res.signers(0).has_transaction_signature()) &&
775 .transaction_signature()
777 txnJson[
"Signers"][0u][
"Signer"][
"TxnSignature"]) &&
778 BEAST_EXPECT(res.signers(0).has_signing_public_key()) &&
781 res.signers(0).signing_public_key().value()) ==
782 txnJson[
"Signers"][0u][
"Signer"][
"SigningPubKey"]);
786 strHex(txns[txns.
size() - 2]->getTransactionID()),
787 [&txns,
this](
auto res) {
788 return BEAST_EXPECT(res.has_deposit_preauth()) &&
790 res.deposit_preauth()
795 txns[txns.
size() - 2]->getJson(
800 strHex(txns[txns.
size() - 3]->getTransactionID()),
801 [&txns,
this](
auto res) {
802 return BEAST_EXPECT(res.has_check_cancel()) &&
804 strHex(res.check_cancel().check_id().value()) ==
806 txns[txns.
size() - 3]->getJson(
811 strHex(txns[txns.
size() - 4]->getTransactionID()),
812 [&txns,
this](
auto res) {
815 return BEAST_EXPECT(res.has_check_cash()) &&
817 strHex(res.check_cash().check_id().value()) ==
818 txnJson[
"CheckID"]) &&
819 BEAST_EXPECT(res.check_cash()
822 .has_xrp_amount()) &&
828 .drops() == txnJson[
"Amount"].asUInt());
832 strHex(txns[txns.
size() - 5]->getTransactionID()),
833 [&txns,
this](
auto res) {
836 return BEAST_EXPECT(res.has_check_create()) &&
841 .address() == txnJson[
"Destination"]) &&
842 BEAST_EXPECT(res.check_create()
845 .has_xrp_amount()) &&
851 .drops() == txnJson[
"SendMax"].asUInt());
855 strHex(txns[txns.
size() - 6]->getTransactionID()),
856 [&txns,
this](
auto res) {
859 return BEAST_EXPECT(res.has_check_create()) &&
864 .address() == txnJson[
"Destination"]) &&
865 BEAST_EXPECT(res.check_create()
868 .has_xrp_amount()) &&
876 txnJson[
"SendMax"].asUInt());
880 strHex(txns[txns.
size() - 7]->getTransactionID()),
881 [&txns,
this](
auto res) {
884 return BEAST_EXPECT(res.has_payment_channel_claim()) &&
886 strHex(res.payment_channel_claim()
888 .value()) == txnJson[
"Channel"]) &&
890 strHex(res.payment_channel_claim()
892 .value()) == txnJson[
"PublicKey"]);
896 strHex(txns[txns.
size() - 8]->getTransactionID()),
897 [&txns,
this](
auto res) {
900 return BEAST_EXPECT(res.has_payment_channel_fund()) &&
903 res.payment_channel_fund().channel().value()) ==
904 txnJson[
"Channel"]) &&
905 BEAST_EXPECT(res.payment_channel_fund()
908 .has_xrp_amount()) &&
910 res.payment_channel_fund()
914 .drops() == txnJson[
"Amount"].asUInt());
918 strHex(txns[txns.
size() - 9]->getTransactionID()),
919 [&txns,
this](
auto res) {
922 return BEAST_EXPECT(res.has_payment_channel_create()) &&
923 BEAST_EXPECT(res.payment_channel_create()
926 .has_xrp_amount()) &&
928 res.payment_channel_create()
932 .drops() == txnJson[
"Amount"].asUInt()) &&
934 res.payment_channel_create()
937 .address() == txnJson[
"Destination"]) &&
939 res.payment_channel_create()
941 .value() == txnJson[
"SettleDelay"].asUInt()) &&
943 strHex(res.payment_channel_create()
945 .value()) == txnJson[
"PublicKey"]);
949 strHex(txns[txns.
size() - 10]->getTransactionID()),
950 [&txns,
this](
auto res) {
953 return BEAST_EXPECT(res.has_escrow_cancel()) &&
955 res.escrow_cancel().owner().value().address() ==
958 res.escrow_cancel().offer_sequence().value() ==
959 txnJson[
"OfferSequence"].asUInt()
965 strHex(txns[txns.
size() - 11]->getTransactionID()),
966 [&txns,
this](
auto res) {
969 return BEAST_EXPECT(res.has_escrow_finish()) &&
971 res.escrow_finish().owner().value().address() ==
974 res.escrow_finish().offer_sequence().value() ==
975 txnJson[
"OfferSequence"].asUInt()
981 strHex(txns[txns.
size() - 12]->getTransactionID()),
982 [&txns,
this](
auto res) {
985 return BEAST_EXPECT(res.has_escrow_create()) &&
986 BEAST_EXPECT(res.escrow_create()
989 .has_xrp_amount()) &&
995 .drops() == txnJson[
"Amount"].asUInt()) &&
1000 .address() == txnJson[
"Destination"]) &&
1002 res.escrow_create().cancel_after().value() ==
1003 txnJson[
"CancelAfter"].asUInt()) &&
1005 res.escrow_create().finish_after().value() ==
1006 txnJson[
"FinishAfter"].asUInt());
1010 strHex(txns[txns.
size() - 13]->getTransactionID()),
1011 [&txns,
this](
auto res) {
1014 return BEAST_EXPECT(res.has_escrow_create()) &&
1015 BEAST_EXPECT(res.escrow_create()
1018 .has_xrp_amount()) &&
1024 .drops() == txnJson[
"Amount"].asUInt()) &&
1029 .address() == txnJson[
"Destination"]) &&
1031 res.escrow_create().finish_after().value() ==
1032 txnJson[
"FinishAfter"].asUInt());
1036 strHex(txns[txns.
size() - 14]->getTransactionID()),
1037 [&txns,
this](
auto res) {
1040 return BEAST_EXPECT(res.has_signer_list_set()) &&
1042 res.signer_list_set().signer_quorum().value() ==
1043 txnJson[
"SignerQuorum"].asUInt()) &&
1045 res.signer_list_set().signer_entries().size() ==
1048 res.signer_list_set()
1049 .signer_entries()[0]
1053 txnJson[
"SignerEntries"][0u][
"SignerEntry"]
1056 res.signer_list_set()
1057 .signer_entries()[0]
1060 txnJson[
"SignerEntries"][0u][
"SignerEntry"]
1064 res.signer_list_set()
1065 .signer_entries()[1]
1069 txnJson[
"SignerEntries"][1u][
"SignerEntry"]
1072 res.signer_list_set()
1073 .signer_entries()[1]
1076 txnJson[
"SignerEntries"][1u][
"SignerEntry"]
1080 res.signer_list_set()
1081 .signer_entries()[2]
1085 txnJson[
"SignerEntries"][2u][
"SignerEntry"]
1088 res.signer_list_set()
1089 .signer_entries()[2]
1092 txnJson[
"SignerEntries"][2u][
"SignerEntry"]
1098 strHex(txns[txns.
size() - 15]->getTransactionID()),
1099 [&txns,
this](
auto res) {
1102 return BEAST_EXPECT(res.has_offer_cancel()) &&
1104 res.offer_cancel().offer_sequence().value() ==
1105 txnJson[
"OfferSequence"].asUInt());
1109 strHex(txns[txns.
size() - 16]->getTransactionID()),
1110 [&txns,
this](
auto res) {
1113 return BEAST_EXPECT(res.has_offer_create()) &&
1114 BEAST_EXPECT(res.offer_create()
1117 .has_xrp_amount()) &&
1123 .drops() == txnJson[
"TakerGets"].asUInt()) &&
1124 BEAST_EXPECT(res.offer_create()
1127 .has_issued_currency_amount()) &&
1132 .issued_currency_amount()
1134 .name() == txnJson[
"TakerPays"][
"currency"]) &&
1139 .issued_currency_amount()
1140 .value() == txnJson[
"TakerPays"][
"value"]) &&
1145 .issued_currency_amount()
1147 .address() == txnJson[
"TakerPays"][
"issuer"]);
1151 strHex(txns[txns.
size() - 17]->getTransactionID()),
1152 [&txns,
this](
auto res) {
1155 return BEAST_EXPECT(res.has_trust_set()) &&
1156 BEAST_EXPECT(res.trust_set()
1159 .has_issued_currency_amount()) &&
1164 .issued_currency_amount()
1167 txnJson[
"LimitAmount"][
"currency"]) &&
1172 .issued_currency_amount()
1173 .value() == txnJson[
"LimitAmount"][
"value"]) &&
1178 .issued_currency_amount()
1180 .address() == txnJson[
"LimitAmount"][
"issuer"]);
1184 strHex(txns[txns.
size() - 18]->getTransactionID()),
1185 [&txns,
this](
auto res) {
1188 return BEAST_EXPECT(res.has_set_regular_key()) &&
1190 res.set_regular_key()
1193 .address() == txnJson[
"RegularKey"]);
1197 strHex(txns[txns.
size() - 19]->getTransactionID()),
1198 [&txns,
this](
auto res) {
1201 return BEAST_EXPECT(res.has_payment()) &&
1203 res.payment().amount().value().has_xrp_amount()) &&
1209 .drops() == txnJson[
"Amount"].asUInt()) &&
1211 res.payment().destination().value().address() ==
1212 txnJson[
"Destination"]) &&
1213 BEAST_EXPECT(res.has_source_tag()) &&
1215 res.source_tag().value() ==
1216 txnJson[
"SourceTag"].asUInt()) &&
1217 BEAST_EXPECT(res.payment().has_destination_tag()) &&
1219 res.payment().destination_tag().value() ==
1220 txnJson[
"DestinationTag"].asUInt()) &&
1221 BEAST_EXPECT(res.has_last_ledger_sequence()) &&
1223 res.last_ledger_sequence().value() ==
1224 txnJson[
"LastLedgerSequence"].asUInt()) &&
1225 BEAST_EXPECT(res.has_transaction_signature()) &&
1226 BEAST_EXPECT(res.has_account()) &&
1228 res.account().value().address() ==
1229 txnJson[
"Account"]) &&
1230 BEAST_EXPECT(res.has_flags()) &&
1232 res.flags().value() == txnJson[
"Flags"].asUInt());
1236 strHex(txns[txns.
size() - 20]->getTransactionID()),
1237 [
this](
auto res) {
return BEAST_EXPECT(res.has_account_set()); }},
1240 "9CE54C3B934E473A995B477E92EC229F99CED5B62BF4D2ACE4DC42719103AE2F",
1242 return BEAST_EXPECT(res.has_account_set()) &&
1243 BEAST_EXPECT(res.account_set().set_flag().value() == 8);
1247 "2B5054734FA43C6C7B54F61944FAD6178ACD5D0272B39BA7FCD32A5D3932FBFF",
1248 [&alice,
this](
auto res) {
1249 return BEAST_EXPECT(res.has_payment()) &&
1251 res.payment().amount().value().has_xrp_amount()) &&
1257 .drops() == 1000000000010) &&
1259 res.payment().destination().value().address() ==
1265 static const MetaCheck txMetaCheck[]{
1266 {[
this](
auto meta) {
1267 return BEAST_EXPECT(meta.transaction_index() == 0) &&
1268 BEAST_EXPECT(meta.affected_nodes_size() == 1) &&
1271 meta.affected_nodes().begin(),
1272 meta.affected_nodes().end(),
1273 [](org::xrpl::rpc::v1::AffectedNode
const&
1275 return entry.ledger_entry_type() ==
1276 org::xrpl::rpc::v1::LedgerEntryType::
1277 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1280 {[
this](
auto meta) {
1281 return BEAST_EXPECT(meta.transaction_index() == 0) &&
1282 BEAST_EXPECT(meta.affected_nodes_size() == 3) &&
1285 meta.affected_nodes().begin(),
1286 meta.affected_nodes().end(),
1288 return entry.ledger_entry_type() ==
1289 org::xrpl::rpc::v1::LedgerEntryType::
1290 LEDGER_ENTRY_TYPE_DEPOSIT_PREAUTH;
1294 meta.affected_nodes().begin(),
1296 meta.affected_nodes().end(),
1298 return entry.ledger_entry_type() ==
1299 org::xrpl::rpc::v1::LedgerEntryType::
1300 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1304 meta.affected_nodes().begin(),
1305 meta.affected_nodes().end(),
1307 return entry.ledger_entry_type() ==
1308 org::xrpl::rpc::v1::LedgerEntryType::
1309 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1312 {[
this](
auto meta) {
1313 return BEAST_EXPECT(meta.transaction_index() == 1) &&
1314 BEAST_EXPECT(meta.affected_nodes_size() == 5) &&
1317 meta.affected_nodes().begin(),
1318 meta.affected_nodes().end(),
1320 return entry.ledger_entry_type() ==
1321 org::xrpl::rpc::v1::LedgerEntryType::
1322 LEDGER_ENTRY_TYPE_CHECK;
1326 meta.affected_nodes().begin(),
1327 meta.affected_nodes().end(),
1329 return entry.ledger_entry_type() ==
1330 org::xrpl::rpc::v1::LedgerEntryType::
1331 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1335 meta.affected_nodes().begin(),
1336 meta.affected_nodes().end(),
1338 return entry.ledger_entry_type() ==
1339 org::xrpl::rpc::v1::LedgerEntryType::
1340 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1343 {[
this](
auto meta) {
1344 return BEAST_EXPECT(meta.transaction_index() == 0) &&
1345 BEAST_EXPECT(meta.affected_nodes_size() == 5) &&
1348 meta.affected_nodes().begin(),
1349 meta.affected_nodes().end(),
1351 return entry.ledger_entry_type() ==
1352 org::xrpl::rpc::v1::LedgerEntryType::
1353 LEDGER_ENTRY_TYPE_CHECK;
1357 meta.affected_nodes().begin(),
1358 meta.affected_nodes().end(),
1360 return entry.ledger_entry_type() ==
1361 org::xrpl::rpc::v1::LedgerEntryType::
1362 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1366 meta.affected_nodes().begin(),
1367 meta.affected_nodes().end(),
1369 return entry.ledger_entry_type() ==
1370 org::xrpl::rpc::v1::LedgerEntryType::
1371 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1374 {[
this](
auto meta) {
1375 return BEAST_EXPECT(meta.transaction_index() == 1) &&
1376 BEAST_EXPECT(meta.affected_nodes_size() == 5) &&
1379 meta.affected_nodes().begin(),
1380 meta.affected_nodes().end(),
1382 return entry.ledger_entry_type() ==
1383 org::xrpl::rpc::v1::LedgerEntryType::
1384 LEDGER_ENTRY_TYPE_CHECK;
1388 meta.affected_nodes().begin(),
1389 meta.affected_nodes().end(),
1391 return entry.ledger_entry_type() ==
1392 org::xrpl::rpc::v1::LedgerEntryType::
1393 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1397 meta.affected_nodes().begin(),
1398 meta.affected_nodes().end(),
1400 return entry.ledger_entry_type() ==
1401 org::xrpl::rpc::v1::LedgerEntryType::
1402 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1405 {[
this](
auto meta) {
1406 return BEAST_EXPECT(meta.transaction_index() == 0) &&
1407 BEAST_EXPECT(meta.affected_nodes_size() == 5) &&
1410 meta.affected_nodes().begin(),
1411 meta.affected_nodes().end(),
1413 return entry.ledger_entry_type() ==
1414 org::xrpl::rpc::v1::LedgerEntryType::
1415 LEDGER_ENTRY_TYPE_CHECK;
1419 meta.affected_nodes().begin(),
1420 meta.affected_nodes().end(),
1422 return entry.ledger_entry_type() ==
1423 org::xrpl::rpc::v1::LedgerEntryType::
1424 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1428 meta.affected_nodes().begin(),
1429 meta.affected_nodes().end(),
1431 return entry.ledger_entry_type() ==
1432 org::xrpl::rpc::v1::LedgerEntryType::
1433 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1436 {[
this](
auto meta) {
1437 return BEAST_EXPECT(meta.transaction_index() == 0) &&
1438 BEAST_EXPECT(meta.affected_nodes_size() == 5) &&
1441 meta.affected_nodes().begin(),
1442 meta.affected_nodes().end(),
1444 return entry.ledger_entry_type() ==
1445 org::xrpl::rpc::v1::LedgerEntryType::
1446 LEDGER_ENTRY_TYPE_PAY_CHANNEL;
1450 meta.affected_nodes().begin(),
1451 meta.affected_nodes().end(),
1453 return entry.ledger_entry_type() ==
1454 org::xrpl::rpc::v1::LedgerEntryType::
1455 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1459 meta.affected_nodes().begin(),
1460 meta.affected_nodes().end(),
1462 return entry.ledger_entry_type() ==
1463 org::xrpl::rpc::v1::LedgerEntryType::
1464 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1467 {[
this](
auto meta) {
1468 return BEAST_EXPECT(meta.transaction_index() == 0) &&
1469 BEAST_EXPECT(meta.affected_nodes_size() == 2) &&
1473 meta.affected_nodes().begin(),
1474 meta.affected_nodes().end(),
1476 return entry.ledger_entry_type() ==
1477 org::xrpl::rpc::v1::LedgerEntryType::
1478 LEDGER_ENTRY_TYPE_PAY_CHANNEL;
1482 meta.affected_nodes().begin(),
1483 meta.affected_nodes().end(),
1485 return entry.ledger_entry_type() ==
1486 org::xrpl::rpc::v1::LedgerEntryType::
1487 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1490 {[
this](
auto meta) {
1491 return BEAST_EXPECT(meta.transaction_index() == 0) &&
1492 BEAST_EXPECT(meta.affected_nodes_size() == 5) &&
1496 meta.affected_nodes().begin(),
1497 meta.affected_nodes().end(),
1499 return entry.ledger_entry_type() ==
1500 org::xrpl::rpc::v1::LedgerEntryType::
1501 LEDGER_ENTRY_TYPE_PAY_CHANNEL;
1505 meta.affected_nodes().begin(),
1506 meta.affected_nodes().end(),
1508 return entry.ledger_entry_type() ==
1509 org::xrpl::rpc::v1::LedgerEntryType::
1510 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1514 meta.affected_nodes().begin(),
1515 meta.affected_nodes().end(),
1517 return entry.ledger_entry_type() ==
1518 org::xrpl::rpc::v1::LedgerEntryType::
1519 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1522 {[
this](
auto meta) {
1523 return BEAST_EXPECT(meta.transaction_index() == 1) &&
1524 BEAST_EXPECT(meta.affected_nodes_size() == 3) &&
1527 meta.affected_nodes().begin(),
1528 meta.affected_nodes().end(),
1530 return entry.ledger_entry_type() ==
1531 org::xrpl::rpc::v1::LedgerEntryType::
1532 LEDGER_ENTRY_TYPE_ESCROW;
1536 meta.affected_nodes().begin(),
1537 meta.affected_nodes().end(),
1539 return entry.ledger_entry_type() ==
1540 org::xrpl::rpc::v1::LedgerEntryType::
1541 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1545 meta.affected_nodes().begin(),
1546 meta.affected_nodes().end(),
1548 return entry.ledger_entry_type() ==
1549 org::xrpl::rpc::v1::LedgerEntryType::
1550 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1553 {[
this](
auto meta) {
1554 return BEAST_EXPECT(meta.transaction_index() == 0) &&
1555 BEAST_EXPECT(meta.affected_nodes_size() == 3) &&
1558 meta.affected_nodes().begin(),
1559 meta.affected_nodes().end(),
1561 return entry.ledger_entry_type() ==
1562 org::xrpl::rpc::v1::LedgerEntryType::
1563 LEDGER_ENTRY_TYPE_ESCROW;
1567 meta.affected_nodes().begin(),
1568 meta.affected_nodes().end(),
1570 return entry.ledger_entry_type() ==
1571 org::xrpl::rpc::v1::LedgerEntryType::
1572 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1576 meta.affected_nodes().begin(),
1577 meta.affected_nodes().end(),
1579 return entry.ledger_entry_type() ==
1580 org::xrpl::rpc::v1::LedgerEntryType::
1581 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1584 {[
this](
auto meta) {
1585 return BEAST_EXPECT(meta.transaction_index() == 2) &&
1586 BEAST_EXPECT(meta.affected_nodes_size() == 3) &&
1590 meta.affected_nodes().begin(),
1591 meta.affected_nodes().end(),
1593 return entry.ledger_entry_type() ==
1594 org::xrpl::rpc::v1::LedgerEntryType::
1595 LEDGER_ENTRY_TYPE_ESCROW;
1599 meta.affected_nodes().begin(),
1600 meta.affected_nodes().end(),
1602 return entry.ledger_entry_type() ==
1603 org::xrpl::rpc::v1::LedgerEntryType::
1604 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1608 meta.affected_nodes().begin(),
1609 meta.affected_nodes().end(),
1611 return entry.ledger_entry_type() ==
1612 org::xrpl::rpc::v1::LedgerEntryType::
1613 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1616 {[
this](
auto meta) {
1617 return BEAST_EXPECT(meta.transaction_index() == 1) &&
1618 BEAST_EXPECT(meta.affected_nodes_size() == 3) &&
1622 meta.affected_nodes().begin(),
1623 meta.affected_nodes().end(),
1625 return entry.ledger_entry_type() ==
1626 org::xrpl::rpc::v1::LedgerEntryType::
1627 LEDGER_ENTRY_TYPE_ESCROW;
1631 meta.affected_nodes().begin(),
1632 meta.affected_nodes().end(),
1634 return entry.ledger_entry_type() ==
1635 org::xrpl::rpc::v1::LedgerEntryType::
1636 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1640 meta.affected_nodes().begin(),
1641 meta.affected_nodes().end(),
1643 return entry.ledger_entry_type() ==
1644 org::xrpl::rpc::v1::LedgerEntryType::
1645 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1648 {[
this](
auto meta) {
1649 return BEAST_EXPECT(meta.transaction_index() == 0) &&
1650 BEAST_EXPECT(meta.affected_nodes_size() == 3) &&
1653 meta.affected_nodes().begin(),
1654 meta.affected_nodes().end(),
1656 return entry.ledger_entry_type() ==
1657 org::xrpl::rpc::v1::LedgerEntryType::
1658 LEDGER_ENTRY_TYPE_SIGNER_LIST;
1662 meta.affected_nodes().begin(),
1663 meta.affected_nodes().end(),
1665 return entry.ledger_entry_type() ==
1666 org::xrpl::rpc::v1::LedgerEntryType::
1667 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1671 meta.affected_nodes().begin(),
1672 meta.affected_nodes().end(),
1674 return entry.ledger_entry_type() ==
1675 org::xrpl::rpc::v1::LedgerEntryType::
1676 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1679 {[
this](
auto meta) {
1680 return BEAST_EXPECT(meta.transaction_index() == 0) &&
1681 BEAST_EXPECT(meta.affected_nodes_size() == 4) &&
1684 meta.affected_nodes().begin(),
1685 meta.affected_nodes().end(),
1687 return entry.ledger_entry_type() ==
1688 org::xrpl::rpc::v1::LedgerEntryType::
1689 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1693 meta.affected_nodes().begin(),
1694 meta.affected_nodes().end(),
1696 return entry.ledger_entry_type() ==
1697 org::xrpl::rpc::v1::LedgerEntryType::
1698 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1702 meta.affected_nodes().begin(),
1703 meta.affected_nodes().end(),
1705 return entry.ledger_entry_type() ==
1706 org::xrpl::rpc::v1::LedgerEntryType::
1707 LEDGER_ENTRY_TYPE_OFFER;
1710 {[
this](
auto meta) {
1711 return BEAST_EXPECT(meta.transaction_index() == 1) &&
1712 BEAST_EXPECT(meta.affected_nodes_size() == 4) &&
1716 meta.affected_nodes().begin(),
1717 meta.affected_nodes().end(),
1719 return entry.ledger_entry_type() ==
1720 org::xrpl::rpc::v1::LedgerEntryType::
1721 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1725 meta.affected_nodes().begin(),
1726 meta.affected_nodes().end(),
1728 return entry.ledger_entry_type() ==
1729 org::xrpl::rpc::v1::LedgerEntryType::
1730 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1734 meta.affected_nodes().begin(),
1735 meta.affected_nodes().end(),
1737 return entry.ledger_entry_type() ==
1738 org::xrpl::rpc::v1::LedgerEntryType::
1739 LEDGER_ENTRY_TYPE_OFFER;
1742 {[
this](
auto meta) {
1743 return BEAST_EXPECT(meta.transaction_index() == 0) &&
1744 BEAST_EXPECT(meta.affected_nodes_size() == 5) &&
1747 meta.affected_nodes().begin(),
1748 meta.affected_nodes().end(),
1750 return entry.ledger_entry_type() ==
1751 org::xrpl::rpc::v1::LedgerEntryType::
1752 LEDGER_ENTRY_TYPE_DIRECTORY_NODE;
1756 meta.affected_nodes().begin(),
1757 meta.affected_nodes().end(),
1759 return entry.ledger_entry_type() ==
1760 org::xrpl::rpc::v1::LedgerEntryType::
1761 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1765 meta.affected_nodes().begin(),
1766 meta.affected_nodes().end(),
1768 return entry.ledger_entry_type() ==
1769 org::xrpl::rpc::v1::LedgerEntryType::
1770 LEDGER_ENTRY_TYPE_RIPPLE_STATE;
1773 {[
this](
auto meta) {
1774 return BEAST_EXPECT(meta.transaction_index() == 2) &&
1775 BEAST_EXPECT(meta.affected_nodes_size() == 1) &&
1778 meta.affected_nodes().begin(),
1779 meta.affected_nodes().end(),
1781 return entry.ledger_entry_type() ==
1782 org::xrpl::rpc::v1::LedgerEntryType::
1783 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1786 {[
this](
auto meta) {
1787 return BEAST_EXPECT(meta.transaction_index() == 1) &&
1788 BEAST_EXPECT(meta.affected_nodes_size() == 2) &&
1791 meta.affected_nodes().begin(),
1792 meta.affected_nodes().end(),
1794 return entry.ledger_entry_type() ==
1795 org::xrpl::rpc::v1::LedgerEntryType::
1796 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1799 {[
this](
auto meta) {
1800 return BEAST_EXPECT(meta.transaction_index() == 0) &&
1801 BEAST_EXPECT(meta.affected_nodes_size() == 1) &&
1804 meta.affected_nodes().begin(),
1805 meta.affected_nodes().end(),
1807 return entry.ledger_entry_type() ==
1808 org::xrpl::rpc::v1::LedgerEntryType::
1809 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1812 {[
this](
auto meta) {
1813 return BEAST_EXPECT(meta.transaction_index() == 2) &&
1814 BEAST_EXPECT(meta.affected_nodes_size() == 1) &&
1817 meta.affected_nodes().begin(),
1818 meta.affected_nodes().end(),
1820 return entry.ledger_entry_type() ==
1821 org::xrpl::rpc::v1::LedgerEntryType::
1822 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1825 {[
this](
auto meta) {
1826 return BEAST_EXPECT(meta.transaction_index() == 0) &&
1827 BEAST_EXPECT(meta.affected_nodes_size() == 2) &&
1830 meta.affected_nodes().begin(),
1831 meta.affected_nodes().end(),
1833 return entry.ledger_entry_type() ==
1834 org::xrpl::rpc::v1::LedgerEntryType::
1835 LEDGER_ENTRY_TYPE_ACCOUNT_ROOT;
1839 auto doCheck = [
this](
auto txn,
auto txCheck) {
1840 return BEAST_EXPECT(txn.has_transaction()) &&
1841 BEAST_EXPECT(txn.validated()) &&
1842 BEAST_EXPECT(
strHex(txn.hash()) == txCheck.hash) &&
1843 BEAST_EXPECT(txn.ledger_index() == txCheck.ledgerIndex) &&
1845 txn.transaction().sequence().value() ==
1846 txCheck.sequence) &&
1847 txCheck.checkTxn(txn.transaction());
1850 auto doMetaCheck = [
this](
auto txn,
auto txMetaCheck) {
1851 return BEAST_EXPECT(txn.has_meta()) &&
1852 BEAST_EXPECT(txn.meta().has_transaction_result()) &&
1854 txn.meta().transaction_result().result_type() ==
1855 org::xrpl::rpc::v1::TransactionResult::
1858 txn.meta().transaction_result().result() ==
1860 txMetaCheck(txn.meta());
1863 auto [res, status] =
next(grpcPort, env, alice.human());
1865 if (!BEAST_EXPECT(status.error_code() == 0))
1868 if (!BEAST_EXPECT(res.transactions().size() ==
std::size(txCheck)))
1870 for (
int i = 0; i < res.transactions().size(); ++i)
1872 BEAST_EXPECT(doCheck(res.transactions()[i], txCheck[i]));
1873 BEAST_EXPECT(doMetaCheck(res.transactions()[i], txMetaCheck[i]));
1881 if (!BEAST_EXPECT(res.transactions().size() == txns.
size() + 2))
1885 for (
int i = 0; i < txns.
size(); ++i)
1887 auto toByteString = [](
auto data) {
1888 const char* bytes =
reinterpret_cast<const char*
>(data.data());
1896 BEAST_EXPECT(res.transactions(i).transaction_binary() == bin);
1903 testcase(
"Test Account_tx Grpc");
1905 using namespace test::jtx;
1908 Env env(*
this, std::move(config));
1914 env.fund(XRP(10000), A1, A2, A3);
1917 env.trust(A3[
"USD"](1000), A1);
1918 env.trust(A2[
"USD"](1000), A1);
1919 env.trust(A3[
"USD"](1000), A2);
1922 for (
auto i = 0; i < 5; ++i)
1924 env(pay(A2, A1, A2[
"USD"](2)));
1925 env(pay(A3, A1, A3[
"USD"](2)));
1926 env(offer(A1, XRP(11), A1[
"USD"](1)));
1927 env(offer(A2, XRP(10), A2[
"USD"](1)));
1928 env(offer(A3, XRP(9), A3[
"USD"](1)));
1953 auto [res, status] =
next(grpcPort, env, A3.human(), 2, 5, 2,
true);
1955 auto txs = res.transactions();
1956 if (!BEAST_EXPECT(txs.size() == 2))
1961 if (!BEAST_EXPECT(res.has_marker()))
1965 grpcPort, env, A3.human(), 2, 5, 2,
true, res.mutable_marker());
1966 txs = res.transactions();
1967 if (!BEAST_EXPECT(txs.size() == 2))
1971 if (!BEAST_EXPECT(res.has_marker()))
1975 grpcPort, env, A3.human(), 2, 5, 2,
true, res.mutable_marker());
1976 txs = res.transactions();
1977 if (!BEAST_EXPECT(txs.size() == 2))
1981 BEAST_EXPECT(!res.has_marker());
1987 auto [res, status] =
next(grpcPort, env, A3.human(), 3, 9, 1,
true);
1988 auto txs = res.transactions();
1989 if (!BEAST_EXPECT(txs.size() == 1))
1992 if (!BEAST_EXPECT(res.has_marker()))
1996 grpcPort, env, A3.human(), 3, 9, 1,
true, res.mutable_marker());
1997 txs = res.transactions();
1998 if (!BEAST_EXPECT(txs.size() == 1))
2001 if (!BEAST_EXPECT(res.has_marker()))
2005 grpcPort, env, A3.human(), 3, 9, 1,
true, res.mutable_marker());
2006 txs = res.transactions();
2007 if (!BEAST_EXPECT(txs.size() == 1))
2010 if (!BEAST_EXPECT(res.has_marker()))
2015 grpcPort, env, A3.human(), 3, 9, 3,
true, res.mutable_marker());
2016 txs = res.transactions();
2017 if (!BEAST_EXPECT(txs.size() == 3))
2022 if (!BEAST_EXPECT(res.has_marker()))
2026 grpcPort, env, A3.human(), 3, 9, 3,
true, res.mutable_marker());
2027 txs = res.transactions();
2028 if (!BEAST_EXPECT(txs.size() == 3))
2033 if (!BEAST_EXPECT(res.has_marker()))
2037 grpcPort, env, A3.human(), 3, 9, 3,
true, res.mutable_marker());
2038 txs = res.transactions();
2039 if (!BEAST_EXPECT(txs.size() == 3))
2044 if (!BEAST_EXPECT(res.has_marker()))
2048 grpcPort, env, A3.human(), 3, 9, 3,
true, res.mutable_marker());
2049 txs = res.transactions();
2050 if (!BEAST_EXPECT(txs.size() == 2))
2054 BEAST_EXPECT(!res.has_marker());
2059 auto [res, status] =
2060 next(grpcPort, env, A3.human(), 3, 9, 2,
false);
2061 auto txs = res.transactions();
2062 if (!BEAST_EXPECT(txs.size() == 2))
2066 if (!BEAST_EXPECT(res.has_marker()))
2077 res.mutable_marker());
2078 txs = res.transactions();
2079 if (!BEAST_EXPECT(txs.size() == 2))
2083 if (!BEAST_EXPECT(res.has_marker()))
2095 res.mutable_marker());
2096 txs = res.transactions();
2097 if (!BEAST_EXPECT(txs.size() == 3))
2102 if (!BEAST_EXPECT(res.has_marker()))
2113 res.mutable_marker());
2114 txs = res.transactions();
2115 if (!BEAST_EXPECT(txs.size() == 3))
2120 if (!BEAST_EXPECT(res.has_marker()))
2131 res.mutable_marker());
2132 txs = res.transactions();
2133 if (!BEAST_EXPECT(txs.size() == 3))
2138 if (!BEAST_EXPECT(res.has_marker()))
2149 res.mutable_marker());
2150 txs = res.transactions();
2151 if (!BEAST_EXPECT(txs.size() == 1))
2154 BEAST_EXPECT(!res.has_marker());