mirror of
https://github.com/XRPLF/rippled.git
synced 2026-08-22 06:40:53 +00:00
fix: Add assert for account_info flags (#7987)
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
#include <xrpl/basics/Blob.h>
|
||||
#include <xrpl/basics/Slice.h>
|
||||
#include <xrpl/basics/StringUtilities.h>
|
||||
#include <xrpl/basics/base_uint.h>
|
||||
#include <xrpl/basics/strHex.h>
|
||||
#include <xrpl/beast/utility/instrumentation.h>
|
||||
#include <xrpl/json/json_forwards.h>
|
||||
@@ -30,6 +31,7 @@
|
||||
#include <optional>
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
#include <tuple>
|
||||
#include <utility>
|
||||
|
||||
namespace xrpl {
|
||||
@@ -115,29 +117,37 @@ doAccountInfo(rpc::JsonContext& context)
|
||||
}
|
||||
auto const accountID{id.value()};
|
||||
|
||||
static constexpr std::array<std::pair<std::string_view, LedgerSpecificFlags>, 9> kLsFlags{
|
||||
{{"defaultRipple", lsfDefaultRipple},
|
||||
{"depositAuth", lsfDepositAuth},
|
||||
{"disableMasterKey", lsfDisableMaster},
|
||||
{"disallowIncomingXRP", lsfDisallowXRP},
|
||||
{"globalFreeze", lsfGlobalFreeze},
|
||||
{"noFreeze", lsfNoFreeze},
|
||||
{"passwordSpent", lsfPasswordSpent},
|
||||
{"requireAuthorization", lsfRequireAuth},
|
||||
{"requireDestinationTag", lsfRequireDestTag}}};
|
||||
|
||||
static constexpr std::array<std::pair<std::string_view, LedgerSpecificFlags>, 4>
|
||||
kDisallowIncomingFlags{
|
||||
{{"disallowIncomingNFTokenOffer", lsfDisallowIncomingNFTokenOffer},
|
||||
// Flags that are always reported.
|
||||
static constexpr auto kAccountRootFlags =
|
||||
std::to_array<std::pair<std::string_view, LedgerSpecificFlags>>(
|
||||
{{"allowTrustLineClawback", lsfAllowTrustLineClawback},
|
||||
{"defaultRipple", lsfDefaultRipple},
|
||||
{"depositAuth", lsfDepositAuth},
|
||||
{"disableMasterKey", lsfDisableMaster},
|
||||
{"disallowIncomingCheck", lsfDisallowIncomingCheck},
|
||||
{"disallowIncomingNFTokenOffer", lsfDisallowIncomingNFTokenOffer},
|
||||
{"disallowIncomingPayChan", lsfDisallowIncomingPayChan},
|
||||
{"disallowIncomingTrustline", lsfDisallowIncomingTrustline}}};
|
||||
{"disallowIncomingTrustline", lsfDisallowIncomingTrustline},
|
||||
{"disallowIncomingXRP", lsfDisallowXRP},
|
||||
{"globalFreeze", lsfGlobalFreeze},
|
||||
{"noFreeze", lsfNoFreeze},
|
||||
{"passwordSpent", lsfPasswordSpent},
|
||||
{"requireAuthorization", lsfRequireAuth},
|
||||
{"requireDestinationTag", lsfRequireDestTag}});
|
||||
|
||||
static constexpr std::pair<std::string_view, LedgerSpecificFlags> kAllowTrustLineClawbackFlag{
|
||||
"allowTrustLineClawback", lsfAllowTrustLineClawback};
|
||||
// Flags that are only reported when their amendment is enabled. This can't be `constexpr`,
|
||||
// since the amendment IDs are computed at runtime.
|
||||
static auto const kAmendmentGatedFlags =
|
||||
std::to_array<std::tuple<std::string_view, LedgerSpecificFlags, uint256 const&>>(
|
||||
{{"allowTrustLineLocking", lsfAllowTrustLineLocking, featureTokenEscrow}});
|
||||
|
||||
static constexpr std::pair<std::string_view, LedgerSpecificFlags> kAllowTrustLineLockingFlag{
|
||||
"allowTrustLineLocking", lsfAllowTrustLineLocking};
|
||||
// Every `AccountRoot` flag must be reported by `account_info`, so if a new flag is added, it
|
||||
// needs to be added to one of the arrays above. This can't be a `static_assert` because
|
||||
// `getAccountRootFlags()` builds its map at runtime.
|
||||
XRPL_ASSERT_PARTS(
|
||||
kAccountRootFlags.size() + kAmendmentGatedFlags.size() == getAccountRootFlags().size(),
|
||||
"xrpl::doAccountInfo",
|
||||
"number of account flags");
|
||||
|
||||
auto const sleAccepted = ledger->read(keylet::account(accountID));
|
||||
if (sleAccepted)
|
||||
@@ -157,19 +167,13 @@ doAccountInfo(rpc::JsonContext& context)
|
||||
result[jss::account_data] = jvAccepted;
|
||||
|
||||
json::Value acctFlags{json::ValueType::Object};
|
||||
for (auto const& lsf : kLsFlags)
|
||||
acctFlags[lsf.first.data()] = sleAccepted->isFlag(lsf.second);
|
||||
for (auto const& [name, flag] : kAccountRootFlags)
|
||||
acctFlags[name.data()] = sleAccepted->isFlag(flag);
|
||||
|
||||
for (auto const& lsf : kDisallowIncomingFlags)
|
||||
acctFlags[lsf.first.data()] = sleAccepted->isFlag(lsf.second);
|
||||
|
||||
acctFlags[kAllowTrustLineClawbackFlag.first.data()] =
|
||||
sleAccepted->isFlag(kAllowTrustLineClawbackFlag.second);
|
||||
|
||||
if (ledger->rules().enabled(featureTokenEscrow))
|
||||
for (auto const& [name, flag, amendment] : kAmendmentGatedFlags)
|
||||
{
|
||||
acctFlags[kAllowTrustLineLockingFlag.first.data()] =
|
||||
sleAccepted->isFlag(kAllowTrustLineLockingFlag.second);
|
||||
if (ledger->rules().enabled(amendment))
|
||||
acctFlags[name.data()] = sleAccepted->isFlag(flag);
|
||||
}
|
||||
|
||||
result[jss::account_flags] = std::move(acctFlags);
|
||||
|
||||
Reference in New Issue
Block a user