mirror of
https://github.com/XRPLF/rippled.git
synced 2025-12-02 17:06:00 +00:00
Expose all amendments known by libxrpl (#5026)
This commit is contained in:
@@ -24,6 +24,7 @@
|
|||||||
#include <boost/container/flat_map.hpp>
|
#include <boost/container/flat_map.hpp>
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <bitset>
|
#include <bitset>
|
||||||
|
#include <map>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
@@ -67,6 +68,11 @@
|
|||||||
namespace ripple {
|
namespace ripple {
|
||||||
|
|
||||||
enum class VoteBehavior : int { Obsolete = -1, DefaultNo = 0, DefaultYes };
|
enum class VoteBehavior : int { Obsolete = -1, DefaultNo = 0, DefaultYes };
|
||||||
|
enum class AmendmentSupport : int { Retired = -1, Supported = 0, Unsupported };
|
||||||
|
|
||||||
|
/** All amendments libxrpl knows about. */
|
||||||
|
std::map<std::string, AmendmentSupport> const&
|
||||||
|
allAmendments();
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
|
|
||||||
|
|||||||
@@ -116,6 +116,7 @@ class FeatureCollections
|
|||||||
// name, index, and uint256 feature identifier
|
// name, index, and uint256 feature identifier
|
||||||
boost::multi_index::multi_index_container<Feature, feature_indexing>
|
boost::multi_index::multi_index_container<Feature, feature_indexing>
|
||||||
features;
|
features;
|
||||||
|
std::map<std::string, AmendmentSupport> all;
|
||||||
std::map<std::string, VoteBehavior> supported;
|
std::map<std::string, VoteBehavior> supported;
|
||||||
std::size_t upVotes = 0;
|
std::size_t upVotes = 0;
|
||||||
std::size_t downVotes = 0;
|
std::size_t downVotes = 0;
|
||||||
@@ -179,6 +180,13 @@ public:
|
|||||||
std::string
|
std::string
|
||||||
featureToName(uint256 const& f) const;
|
featureToName(uint256 const& f) const;
|
||||||
|
|
||||||
|
/** All amendments that are registered within the table. */
|
||||||
|
std::map<std::string, AmendmentSupport> const&
|
||||||
|
allAmendments() const
|
||||||
|
{
|
||||||
|
return all;
|
||||||
|
}
|
||||||
|
|
||||||
/** Amendments that this server supports.
|
/** Amendments that this server supports.
|
||||||
Whether they are enabled depends on the Rules defined in the validated
|
Whether they are enabled depends on the Rules defined in the validated
|
||||||
ledger */
|
ledger */
|
||||||
@@ -251,6 +259,14 @@ FeatureCollections::registerFeature(
|
|||||||
|
|
||||||
features.emplace_back(name, f);
|
features.emplace_back(name, f);
|
||||||
|
|
||||||
|
auto const getAmendmentSupport = [=]() {
|
||||||
|
if (vote == VoteBehavior::Obsolete)
|
||||||
|
return AmendmentSupport::Retired;
|
||||||
|
return support == Supported::yes ? AmendmentSupport::Supported
|
||||||
|
: AmendmentSupport::Unsupported;
|
||||||
|
};
|
||||||
|
all.emplace(name, getAmendmentSupport());
|
||||||
|
|
||||||
if (support == Supported::yes)
|
if (support == Supported::yes)
|
||||||
{
|
{
|
||||||
supported.emplace(name, vote);
|
supported.emplace(name, vote);
|
||||||
@@ -266,6 +282,9 @@ FeatureCollections::registerFeature(
|
|||||||
check(
|
check(
|
||||||
supported.size() <= features.size(),
|
supported.size() <= features.size(),
|
||||||
"More supported features than defined features");
|
"More supported features than defined features");
|
||||||
|
check(
|
||||||
|
features.size() == all.size(),
|
||||||
|
"The 'all' features list is populated incorrectly");
|
||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -313,6 +332,13 @@ static FeatureCollections featureCollections;
|
|||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
/** All amendments libxrpl knows of. */
|
||||||
|
std::map<std::string, AmendmentSupport> const&
|
||||||
|
allAmendments()
|
||||||
|
{
|
||||||
|
return featureCollections.allAmendments();
|
||||||
|
}
|
||||||
|
|
||||||
/** Amendments that this server supports.
|
/** Amendments that this server supports.
|
||||||
Whether they are enabled depends on the Rules defined in the validated
|
Whether they are enabled depends on the Rules defined in the validated
|
||||||
ledger */
|
ledger */
|
||||||
|
|||||||
@@ -31,34 +31,75 @@ class Feature_test : public beast::unit_test::suite
|
|||||||
{
|
{
|
||||||
testcase("internals");
|
testcase("internals");
|
||||||
|
|
||||||
std::map<std::string, VoteBehavior> const& supported =
|
auto const& supportedAmendments = ripple::detail::supportedAmendments();
|
||||||
ripple::detail::supportedAmendments();
|
auto const& allAmendments = ripple::allAmendments();
|
||||||
|
|
||||||
BEAST_EXPECT(
|
BEAST_EXPECT(
|
||||||
supported.size() ==
|
supportedAmendments.size() ==
|
||||||
ripple::detail::numDownVotedAmendments() +
|
ripple::detail::numDownVotedAmendments() +
|
||||||
ripple::detail::numUpVotedAmendments());
|
ripple::detail::numUpVotedAmendments());
|
||||||
std::size_t up = 0, down = 0, obsolete = 0;
|
|
||||||
for (std::pair<std::string const, VoteBehavior> const& amendment :
|
|
||||||
supported)
|
|
||||||
{
|
{
|
||||||
switch (amendment.second)
|
std::size_t up = 0, down = 0, obsolete = 0;
|
||||||
|
for (auto const& [name, vote] : supportedAmendments)
|
||||||
{
|
{
|
||||||
case VoteBehavior::DefaultYes:
|
switch (vote)
|
||||||
++up;
|
{
|
||||||
break;
|
case VoteBehavior::DefaultYes:
|
||||||
case VoteBehavior::DefaultNo:
|
++up;
|
||||||
++down;
|
break;
|
||||||
break;
|
case VoteBehavior::DefaultNo:
|
||||||
case VoteBehavior::Obsolete:
|
++down;
|
||||||
++obsolete;
|
break;
|
||||||
break;
|
case VoteBehavior::Obsolete:
|
||||||
default:
|
++obsolete;
|
||||||
fail("Unknown VoteBehavior", __FILE__, __LINE__);
|
break;
|
||||||
|
default:
|
||||||
|
fail("Unknown VoteBehavior", __FILE__, __LINE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vote == VoteBehavior::Obsolete)
|
||||||
|
{
|
||||||
|
BEAST_EXPECT(
|
||||||
|
allAmendments.contains(name) &&
|
||||||
|
allAmendments.at(name) == AmendmentSupport::Retired);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
BEAST_EXPECT(
|
||||||
|
allAmendments.contains(name) &&
|
||||||
|
allAmendments.at(name) == AmendmentSupport::Supported);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
BEAST_EXPECT(
|
||||||
|
down + obsolete == ripple::detail::numDownVotedAmendments());
|
||||||
|
BEAST_EXPECT(up == ripple::detail::numUpVotedAmendments());
|
||||||
|
}
|
||||||
|
{
|
||||||
|
std::size_t supported = 0, unsupported = 0, retired = 0;
|
||||||
|
for (auto const& [name, support] : allAmendments)
|
||||||
|
{
|
||||||
|
switch (support)
|
||||||
|
{
|
||||||
|
case AmendmentSupport::Supported:
|
||||||
|
++supported;
|
||||||
|
BEAST_EXPECT(supportedAmendments.contains(name));
|
||||||
|
break;
|
||||||
|
case AmendmentSupport::Unsupported:
|
||||||
|
++unsupported;
|
||||||
|
break;
|
||||||
|
case AmendmentSupport::Retired:
|
||||||
|
++retired;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fail("Unknown AmendmentSupport", __FILE__, __LINE__);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BEAST_EXPECT(supported + retired == supportedAmendments.size());
|
||||||
|
BEAST_EXPECT(
|
||||||
|
allAmendments.size() - unsupported ==
|
||||||
|
supportedAmendments.size());
|
||||||
}
|
}
|
||||||
BEAST_EXPECT(
|
|
||||||
down + obsolete == ripple::detail::numDownVotedAmendments());
|
|
||||||
BEAST_EXPECT(up == ripple::detail::numUpVotedAmendments());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
Reference in New Issue
Block a user