From da96608febbff2669fd8873c1602f69059a6de4f Mon Sep 17 00:00:00 2001 From: CJ Cobb Date: Tue, 25 Jan 2022 12:11:05 -0500 Subject: [PATCH] add diff flag to ledger command --- src/rpc/handlers/Ledger.cpp | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/rpc/handlers/Ledger.cpp b/src/rpc/handlers/Ledger.cpp index 08b889be..07a6c6c9 100644 --- a/src/rpc/handlers/Ledger.cpp +++ b/src/rpc/handlers/Ledger.cpp @@ -36,6 +36,15 @@ doLedger(Context const& context) expand = params.at("expand").as_bool(); } + bool diff = false; + if (params.contains("diff")) + { + if (!params.at("diff").is_bool()) + return Status{Error::rpcINVALID_PARAMS, "diffFlagNotBool"}; + + diff = params.at("diff").as_bool(); + } + auto v = ledgerInfoFromRequest(context); if (auto status = std::get_if(&v)) return *status; @@ -115,6 +124,30 @@ doLedger(Context const& context) } } + if (diff) + { + header["diff"] = boost::json::value(boost::json::array_kind); + boost::json::array& jsonDiff = header.at("diff").as_array(); + auto diff = context.backend->fetchLedgerDiff(lgrInfo.seq); + for (auto const& obj : diff) + { + boost::json::object entry; + entry["id"] = ripple::strHex(obj.key); + if (binary) + entry["object"] = ripple::strHex(obj.blob); + else if (obj.blob.size()) + { + ripple::STLedgerEntry sle{ + ripple::SerialIter{obj.blob.data(), obj.blob.size()}, + obj.key}; + entry["object"] = toJson(sle); + } + else + entry["object"] = ""; + jsonDiff.push_back(std::move(entry)); + } + } + response["ledger"] = header; response["ledger_hash"] = ripple::strHex(lgrInfo.hash); response["ledger_index"] = lgrInfo.seq;