From ae68a09b06a3a4caf194fdb1b75d6e7faa1abbb4 Mon Sep 17 00:00:00 2001 From: Bronek Kozicki Date: Tue, 25 Mar 2025 11:22:26 +0000 Subject: [PATCH] Supplement ShareTotal in ledger_entry, ledger_data and account_objects. --- src/libxrpl/protocol/STLedgerEntry.cpp | 4 +-- src/xrpld/rpc/detail/RPCHelpers.cpp | 25 ++++++++++++++++++- src/xrpld/rpc/detail/RPCHelpers.h | 23 +++++++++++++++++ src/xrpld/rpc/handlers/LedgerData.cpp | 2 ++ src/xrpld/rpc/handlers/LedgerEntry.cpp | 34 ++------------------------ 5 files changed, 53 insertions(+), 35 deletions(-) diff --git a/src/libxrpl/protocol/STLedgerEntry.cpp b/src/libxrpl/protocol/STLedgerEntry.cpp index f9cdcd5ee2..f39181b953 100644 --- a/src/libxrpl/protocol/STLedgerEntry.cpp +++ b/src/libxrpl/protocol/STLedgerEntry.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -144,8 +145,7 @@ STLedgerEntry::getJson(JsonOptions options) const else if (getType() == ltVAULT) { // Replace "MPTokenIssuanceID" with functionally equivalent "Share" - const char* const fieldMptIssue = sfMPTokenIssuanceID.fieldName.c_str(); - ret.removeMember(fieldMptIssue); + ret.removeMember(sfMPTokenIssuanceID.fieldName.c_str()); ret[jss::Share] = to_json(MPTIssue(getFieldH192(sfMPTokenIssuanceID))); } diff --git a/src/xrpld/rpc/detail/RPCHelpers.cpp b/src/xrpld/rpc/detail/RPCHelpers.cpp index 3449a744d6..ff826c1db9 100644 --- a/src/xrpld/rpc/detail/RPCHelpers.cpp +++ b/src/xrpld/rpc/detail/RPCHelpers.cpp @@ -149,6 +149,26 @@ isRelatedToAccount( return false; } +template <> +void +supplementJson( + ReadView const& view, + std::shared_ptr const& vault, + Json::Value& node) +{ + XRPL_ASSERT( + vault->getType() == ltVAULT, + "ripple::RPC::supplementJson : matching type"); + + auto const share = vault->at(sfMPTokenIssuanceID); + auto const sleIssuance = view.read(keylet::mptIssuance(share)); + if (!sleIssuance) + return; + + node[jss::ShareTotal] = + Number(sleIssuance->getFieldU64(sfOutstandingAmount)); +} + bool getAccountObjects( ReadView const& ledger, @@ -300,7 +320,10 @@ getAccountObjects( if (!typeFilter.has_value() || typeMatchesFilter(typeFilter.value(), sleNode->getType())) { - jvObjects.append(sleNode->getJson(JsonOptions::none)); + auto& entry = + jvObjects.append(sleNode->getJson(JsonOptions::none)); + if (sleNode->getType() == ltVAULT) + RPC::supplementJson(ledger, sleNode, entry); } if (++i == mlimit) diff --git a/src/xrpld/rpc/detail/RPCHelpers.h b/src/xrpld/rpc/detail/RPCHelpers.h index 89af005292..ef3f3acb4d 100644 --- a/src/xrpld/rpc/detail/RPCHelpers.h +++ b/src/xrpld/rpc/detail/RPCHelpers.h @@ -269,6 +269,29 @@ keypairForSignature( Json::Value const& params, Json::Value& error, unsigned int apiVersion = apiVersionIfUnspecified); + +/** + * Supplement JSON of a ledger object with additional data read from a view + * + * To be specialized per ledger object type as needed; any specialization of + * this function must be declared below and defined in RPCHelpers.cpp + * + * The general template is never used, hence it is only declared but not defined + */ +template +inline void +supplementJson( + ReadView const&, + std::shared_ptr const& sle, + Json::Value&); + +template <> +void +supplementJson( + ReadView const& view, + std::shared_ptr const& vault, + Json::Value& node); + } // namespace RPC } // namespace ripple diff --git a/src/xrpld/rpc/handlers/LedgerData.cpp b/src/xrpld/rpc/handlers/LedgerData.cpp index 7bd50cc1e5..f94f8b482e 100644 --- a/src/xrpld/rpc/handlers/LedgerData.cpp +++ b/src/xrpld/rpc/handlers/LedgerData.cpp @@ -124,6 +124,8 @@ doLedgerData(RPC::JsonContext& context) { Json::Value& entry = nodes.append(sle->getJson(JsonOptions::none)); + if (sle->getType() == ltVAULT) + RPC::supplementJson(*lpLedger, sle, entry); entry[jss::index] = to_string(sle->key()); } } diff --git a/src/xrpld/rpc/handlers/LedgerEntry.cpp b/src/xrpld/rpc/handlers/LedgerEntry.cpp index fad2a02647..9c4a4b2bbb 100644 --- a/src/xrpld/rpc/handlers/LedgerEntry.cpp +++ b/src/xrpld/rpc/handlers/LedgerEntry.cpp @@ -894,37 +894,6 @@ struct LedgerEntry LedgerEntryType expectedType; }; -template -static void -supplementJson( - ReadView const&, - std::shared_ptr const& sle, - Json::Value&) -{ - XRPL_ASSERT( - sle->getType() == Type, "ripple::supplementJson : matching type"); -} - -template <> -void -supplementJson( - ReadView const& view, - std::shared_ptr const& vault, - Json::Value& node) -{ - XRPL_ASSERT( - vault->getType() == ltVAULT, - "ripple::supplementJson : matching type"); - - auto const share = vault->at(sfMPTokenIssuanceID); - auto const sleIssuance = view.read(keylet::mptIssuance(share)); - if (!sleIssuance) - return; - - node[jss::ShareTotal] = - Number(sleIssuance->getFieldU64(sfOutstandingAmount)); -} - // { // ledger_hash : // ledger_index : @@ -1065,7 +1034,8 @@ doLedgerEntry(RPC::JsonContext& context) { jvResult[jss::node] = sleNode->getJson(JsonOptions::none); if (sleNode->getType() == ltVAULT) - supplementJson(*lpLedger, sleNode, jvResult[jss::node]); + RPC::supplementJson( + *lpLedger, sleNode, jvResult[jss::node]); jvResult[jss::index] = to_string(uNodeIndex); }