diff --git a/src/ripple/app/ledger/LedgerMaster.h b/src/ripple/app/ledger/LedgerMaster.h index b160f7d43..7a5dfed23 100644 --- a/src/ripple/app/ledger/LedgerMaster.h +++ b/src/ripple/app/ledger/LedgerMaster.h @@ -137,6 +137,12 @@ public: virtual uint256 getLedgerHash( std::uint32_t desiredSeq, Ledger::ref knownGoodLedger) = 0; + virtual boost::optional getCloseTimeBySeq ( + LedgerIndex ledgerIndex) = 0; + + virtual boost::optional getCloseTimeByHash ( + LedgerHash const& ledgerHash) = 0; + virtual void addHeldTransaction (std::shared_ptr const& trans) = 0; virtual void fixMismatch (Ledger::ref ledger) = 0; diff --git a/src/ripple/app/ledger/impl/LedgerMaster.cpp b/src/ripple/app/ledger/impl/LedgerMaster.cpp index b809b4007..68d83c805 100644 --- a/src/ripple/app/ledger/impl/LedgerMaster.cpp +++ b/src/ripple/app/ledger/impl/LedgerMaster.cpp @@ -1377,6 +1377,33 @@ public: return mCompleteLedgers.toString (); } + boost::optional + getCloseTimeBySeq (LedgerIndex ledgerIndex) override + { + uint256 hash = getHashBySeq (ledgerIndex); + return hash.isNonZero() ? getCloseTimeByHash (hash) : boost::none; + } + + boost::optional + getCloseTimeByHash (LedgerHash const& ledgerHash) override + { + auto node = app_.getNodeStore().fetch (ledgerHash); + if (node && + (node->getData().size() >= 120)) + { + SerialIter it (node->getData().data(), node->getData().size()); + if (it.get32() == HashPrefix::ledgerMaster) + { + it.skip ( + 4+8+32+ // seq drops parentHash + 32+32+4); // txHash acctHash parentClose + return it.get32(); + } + } + + return boost::none; + } + uint256 getHashBySeq (std::uint32_t index) override { uint256 hash = mLedgerHistory.getLedgerHash (index); diff --git a/src/ripple/app/misc/impl/Transaction.cpp b/src/ripple/app/misc/impl/Transaction.cpp index b8bf14635..eae6ff14c 100644 --- a/src/ripple/app/misc/impl/Transaction.cpp +++ b/src/ripple/app/misc/impl/Transaction.cpp @@ -161,10 +161,10 @@ Json::Value Transaction::getJson (int options, bool binary) const if (options == 1) { - auto ledger = mApp.getLedgerMaster (). - getLedgerBySeq (mInLedger); - if (ledger) - ret[jss::date] = ledger->info().closeTime; + auto ct = mApp.getLedgerMaster(). + getCloseTimeBySeq (mInLedger); + if (ct) + ret[jss::date] = *ct; } }