diff --git a/src/ripple/rpc/handlers/AccountTx.cpp b/src/ripple/rpc/handlers/AccountTx.cpp index 42a61df94ea..a6a4f0441ed 100644 --- a/src/ripple/rpc/handlers/AccountTx.cpp +++ b/src/ripple/rpc/handlers/AccountTx.cpp @@ -373,19 +373,21 @@ populateProtoResponse( closeTime->time_since_epoch().count()); if (txnMeta) { - if (!txnMeta->hasDeliveredAmount()) + RPC::convert(*txnProto->mutable_meta(), txnMeta); + if (!txnProto->meta().has_delivered_amount()) { - std::optional amount = getDeliveredAmount( - context, - txn->getSTransaction(), - *txnMeta, - txn->getLedger()); - if (amount) + if (auto amt = getDeliveredAmount( + context, + txn->getSTransaction(), + *txnMeta, + txn->getLedger())) { - txnMeta->setDeliveredAmount(*amount); + RPC::convert( + *txnProto->mutable_meta() + ->mutable_delivered_amount(), + *amt); } } - RPC::convert(*txnProto->mutable_meta(), txnMeta); } } } diff --git a/src/ripple/rpc/impl/GRPCHelpers.cpp b/src/ripple/rpc/impl/GRPCHelpers.cpp index 1d2f5af69b2..0c068b08d45 100644 --- a/src/ripple/rpc/impl/GRPCHelpers.cpp +++ b/src/ripple/rpc/impl/GRPCHelpers.cpp @@ -1567,6 +1567,9 @@ convert(org::xrpl::rpc::v1::Meta& to, std::shared_ptr const& from) to.mutable_transaction_result()->set_result( transToken(from->getResultTER())); + if (from->hasDeliveredAmount()) + convert(*to.mutable_delivered_amount(), from->getDeliveredAmount()); + STArray& nodes = from->getNodes(); for (auto it = nodes.begin(); it != nodes.end(); ++it) { diff --git a/src/test/rpc/Tx_test.cpp b/src/test/rpc/Tx_test.cpp index a43c5af9d6e..1658a0ebd5b 100644 --- a/src/test/rpc/Tx_test.cpp +++ b/src/test/rpc/Tx_test.cpp @@ -505,6 +505,25 @@ class Tx_test : public beast::unit_test::suite } }; + class GrpcAccountTxClient : public GRPCTestClientBase + { + public: + org::xrpl::rpc::v1::GetAccountTransactionHistoryRequest request; + org::xrpl::rpc::v1::GetAccountTransactionHistoryResponse reply; + + explicit GrpcAccountTxClient(std::string const& port) + : GRPCTestClientBase(port) + { + } + + void + AccountTx() + { + status = + stub_->GetAccountTransactionHistory(&context, request, &reply); + } + }; + void testTxGrpc() { @@ -674,22 +693,65 @@ class Tx_test : public beast::unit_test::suite cmpPaymentTx(result.second.transaction(), tx); } - if (ledger && !b) - { - auto rawMeta = ledger->txRead(id).second; - if (rawMeta) - { - auto txMeta = std::make_shared( - id, ledger->seq(), *rawMeta); - - cmpMeta(result.second.meta(), txMeta); - cmpDeliveredAmount( - result.second.meta(), - result.second.transaction(), - txMeta, - tx); - } - } + if (!ledger || b) + continue; + + auto rawMeta = ledger->txRead(id).second; + if (!rawMeta) + continue; + + auto txMeta = + std::make_shared(id, ledger->seq(), *rawMeta); + + cmpMeta(result.second.meta(), txMeta); + cmpDeliveredAmount( + result.second.meta(), + result.second.transaction(), + txMeta, + tx); + + auto grpcAccountTx = [&grpcPort]( + uint256 const& id, + bool binary, + AccountID const& account) + -> std:: + pair { + GrpcAccountTxClient client(grpcPort); + client.request.set_binary(binary); + client.request.mutable_account()->set_address( + toBase58(account)); + client.AccountTx(); + org::xrpl::rpc::v1::GetTransactionResponse res; + + for (auto const& tx : client.reply.transactions()) + { + if (uint256::fromVoid(tx.hash().data()) == id) + { + return {client.status.ok(), tx}; + } + } + return {false, res}; + }; + + // Compare result to result from account_tx + auto mentioned = tx->getMentionedAccounts(); + + if (!BEAST_EXPECT(mentioned.size())) + continue; + + auto account = *mentioned.begin(); + auto const accountTxResult = grpcAccountTx(id, b, account); + + if (!BEAST_EXPECT(accountTxResult.first)) + continue; + + cmpPaymentTx(accountTxResult.second.transaction(), tx); + cmpMeta(accountTxResult.second.meta(), txMeta); + cmpDeliveredAmount( + accountTxResult.second.meta(), + accountTxResult.second.transaction(), + txMeta, + tx); } index++; }