diff --git a/include/xrpl/ledger/entries/AmendmentsEntry.h b/include/xrpl/ledger/entries/AmendmentsEntry.h index ce4dca7e80..808c6d1f54 100644 --- a/include/xrpl/ledger/entries/AmendmentsEntry.h +++ b/include/xrpl/ledger/entries/AmendmentsEntry.h @@ -1,11 +1,17 @@ #pragma once +#include +#include #include #include #include #include #include #include +#include + +#include +#include namespace xrpl { @@ -25,6 +31,52 @@ public: : Base(keylet::amendments(), view, j) { } + + /** + * Returns the set of amendments this entry reports as enabled. + * + * @return the set of enabled amendments. + */ + [[nodiscard]] std::set + enabledAmendments() const + { + std::set amendments; + + if (this->exists() && (*this)->isFieldPresent(sfAmendments)) + { + auto const& v = (*this)->getFieldV256(sfAmendments); + amendments.insert_range(v); + } + + return amendments; + } + + /** + * Returns a map of amendments that have achieved majority, to the time + * majority was reached. + * + * @return a map of amendment to the time majority was reached. + */ + [[nodiscard]] std::map + majorityAmendments() const + { + std::map ret; + + if (this->exists() && (*this)->isFieldPresent(sfMajorities)) + { + using TimePoint = NetClock::time_point; + using Duration = TimePoint::duration; + + auto const majorities = (*this)->getFieldArray(sfMajorities); + + for (auto const& m : majorities) + { + ret[m.getFieldH256(sfAmendment)] = TimePoint(Duration(m.getFieldU32(sfCloseTime))); + } + } + + return ret; + } }; using AmendmentsEntryR = AmendmentsEntry; diff --git a/src/libxrpl/ledger/ReadView.cpp b/src/libxrpl/ledger/ReadView.cpp index 6ed6ce4a3f..a2ef396c1b 100644 --- a/src/libxrpl/ledger/ReadView.cpp +++ b/src/libxrpl/ledger/ReadView.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -72,9 +73,8 @@ makeRulesGivenLedger( std::optional const digest = ledger.digest(k.key); if (digest) { - auto const sle = ledger.read(k); - if (sle) - return Rules(presets, digest, sle->getFieldV256(sfAmendments)); + if (AmendmentsEntryR const entry(k, ledger); entry) + return Rules(presets, digest, entry->getFieldV256(sfAmendments)); } return Rules(presets); } diff --git a/src/libxrpl/ledger/View.cpp b/src/libxrpl/ledger/View.cpp index 81e960ca78..57d2c3270a 100644 --- a/src/libxrpl/ledger/View.cpp +++ b/src/libxrpl/ledger/View.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -309,40 +310,13 @@ areCompatible( std::set getEnabledAmendments(ReadView const& view) { - std::set amendments; - - if (auto const sle = view.read(keylet::amendments())) - { - if (sle->isFieldPresent(sfAmendments)) - { - auto const& v = sle->getFieldV256(sfAmendments); - amendments.insert(v.begin(), v.end()); - } - } - - return amendments; + return AmendmentsEntryR(view).enabledAmendments(); } MajorityAmendmentsT getMajorityAmendments(ReadView const& view) { - MajorityAmendmentsT ret; - - if (auto const sle = view.read(keylet::amendments())) - { - if (sle->isFieldPresent(sfMajorities)) - { - using Tp = NetClock::time_point; - using D = Tp::duration; - - auto const majorities = sle->getFieldArray(sfMajorities); - - for (auto const& m : majorities) - ret[m.getFieldH256(sfAmendment)] = Tp(D(m.getFieldU32(sfCloseTime))); - } - } - - return ret; + return AmendmentsEntryR(view).majorityAmendments(); } std::optional diff --git a/src/libxrpl/tx/transactors/system/Change.cpp b/src/libxrpl/tx/transactors/system/Change.cpp index d75fd185e0..86d91a9a47 100644 --- a/src/libxrpl/tx/transactors/system/Change.cpp +++ b/src/libxrpl/tx/transactors/system/Change.cpp @@ -8,10 +8,10 @@ #include #include #include +#include #include #include #include -#include #include #include #include @@ -27,7 +27,6 @@ #include #include -#include namespace xrpl { @@ -170,14 +169,12 @@ Change::applyAmendment() { UInt256 const amendment(ctx_.tx.getFieldH256(sfAmendment)); - auto const k = keylet::amendments(); - - SLE::pointer amendmentObject = view().peek(k); + AmendmentsEntryW amendmentObject(view(), j_); if (!amendmentObject) { - amendmentObject = std::make_shared(k); - view().insert(amendmentObject); + amendmentObject.newSLE(); + amendmentObject.insert(); } STVector256 amendments = amendmentObject->getFieldV256(sfAmendments); @@ -254,7 +251,7 @@ Change::applyAmendment() amendmentObject->setFieldArray(sfMajorities, newMajorities); } - view().update(amendmentObject); + amendmentObject.update(); return tesSUCCESS; }