fix: Add assert for account_info flags (#7987)

This commit is contained in:
Mayukha Vadari
2026-08-21 15:20:44 +00:00
committed by GitHub
parent 046d4dd4af
commit fe4ccdf750

View File

@@ -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);