fix: add trustline locking flag to account_info (#2338)

fixes #2323

---------

Co-authored-by: Ayaz Salikhov <mathbunnyru@users.noreply.github.com>
This commit is contained in:
Peter Chen
2025-08-19 10:07:21 -04:00
committed by GitHub
parent caedb51f00
commit e9ab081ab7
3 changed files with 29 additions and 7 deletions

View File

@@ -88,6 +88,7 @@ AccountInfoHandler::process(AccountInfoHandler::Input const& input, Context cons
auto const isDisallowIncomingEnabled = isEnabled(Amendments::DisallowIncoming);
auto const isClawbackEnabled = isEnabled(Amendments::Clawback);
auto const isTokenEscrowEnabled = isEnabled(Amendments::TokenEscrow);
// Return SignerList(s) if that is requested.
if (input.signerLists) {
@@ -117,13 +118,20 @@ AccountInfoHandler::process(AccountInfoHandler::Input const& input, Context cons
sle,
isDisallowIncomingEnabled,
isClawbackEnabled,
isTokenEscrowEnabled,
ctx.apiVersion,
signerList
);
}
return Output(
lgrInfo.seq, ripple::strHex(lgrInfo.hash), sle, isDisallowIncomingEnabled, isClawbackEnabled, ctx.apiVersion
lgrInfo.seq,
ripple::strHex(lgrInfo.hash),
sle,
isDisallowIncomingEnabled,
isClawbackEnabled,
isTokenEscrowEnabled,
ctx.apiVersion
);
}
@@ -159,9 +167,11 @@ tag_invoke(boost::json::value_from_tag, boost::json::value& jv, AccountInfoHandl
lsFlags.insert(lsFlags.end(), disallowIncomingFlags.begin(), disallowIncomingFlags.end());
}
if (output.isClawbackEnabled) {
if (output.isClawbackEnabled)
lsFlags.emplace_back("allowTrustLineClawback", ripple::lsfAllowTrustLineClawback);
}
if (output.isTokenEscrowEnabled)
lsFlags.emplace_back("allowTrustLineLocking", ripple::lsfAllowTrustLineLocking);
boost::json::object acctFlags;
for (auto const& lsf : lsFlags)

View File

@@ -61,6 +61,7 @@ public:
ripple::STLedgerEntry accountData;
bool isDisallowIncomingEnabled = false;
bool isClawbackEnabled = false;
bool isTokenEscrowEnabled = false;
uint32_t apiVersion;
std::optional<std::vector<ripple::STLedgerEntry>> signerLists;
// validated should be sent via framework
@@ -74,6 +75,7 @@ public:
* @param sle The account data
* @param isDisallowIncomingEnabled Whether disallow incoming is enabled
* @param isClawbackEnabled Whether clawback is enabled
* @param isTokenEscrowEnabled Whether token escrow is enabled
* @param version The API version
* @param signerLists The signer lists
*/
@@ -83,6 +85,7 @@ public:
ripple::STLedgerEntry sle,
bool isDisallowIncomingEnabled,
bool isClawbackEnabled,
bool isTokenEscrowEnabled,
uint32_t version,
std::optional<std::vector<ripple::STLedgerEntry>> signerLists = std::nullopt
)
@@ -91,6 +94,7 @@ public:
, accountData(std::move(sle))
, isDisallowIncomingEnabled(isDisallowIncomingEnabled)
, isClawbackEnabled(isClawbackEnabled)
, isTokenEscrowEnabled(isTokenEscrowEnabled)
, apiVersion(version)
, signerLists(std::move(signerLists))
{

View File

@@ -329,6 +329,7 @@ TEST_F(RPCAccountInfoHandlerTest, SignerListsInvalid)
.WillByDefault(Return(createLegacyFeeSettingBlob(1, 2, 3, 4, 0)));
EXPECT_CALL(*mockAmendmentCenterPtr_, isEnabled(_, Amendments::DisallowIncoming, _)).WillOnce(Return(false));
EXPECT_CALL(*mockAmendmentCenterPtr_, isEnabled(_, Amendments::Clawback, _)).WillOnce(Return(false));
EXPECT_CALL(*mockAmendmentCenterPtr_, isEnabled(_, Amendments::TokenEscrow, _)).WillOnce(Return(false));
EXPECT_CALL(*backend_, doFetchLedgerObject).Times(2);
static auto const kINPUT = json::parse(
@@ -434,6 +435,7 @@ TEST_F(RPCAccountInfoHandlerTest, SignerListsTrueV2)
.WillByDefault(Return(createSignerLists({{kACCOUNT1, 1}, {kACCOUNT2, 1}}).getSerializer().peekData()));
EXPECT_CALL(*mockAmendmentCenterPtr_, isEnabled(_, Amendments::DisallowIncoming, _)).WillOnce(Return(false));
EXPECT_CALL(*mockAmendmentCenterPtr_, isEnabled(_, Amendments::Clawback, _)).WillOnce(Return(false));
EXPECT_CALL(*mockAmendmentCenterPtr_, isEnabled(_, Amendments::TokenEscrow, _)).WillOnce(Return(false));
EXPECT_CALL(*backend_, doFetchLedgerObject).Times(2);
static auto const kINPUT = json::parse(
@@ -537,6 +539,7 @@ TEST_F(RPCAccountInfoHandlerTest, SignerListsTrueV1)
.WillByDefault(Return(createSignerLists({{kACCOUNT1, 1}, {kACCOUNT2, 1}}).getSerializer().peekData()));
EXPECT_CALL(*mockAmendmentCenterPtr_, isEnabled(_, Amendments::DisallowIncoming, _)).WillOnce(Return(false));
EXPECT_CALL(*mockAmendmentCenterPtr_, isEnabled(_, Amendments::Clawback, _)).WillOnce(Return(false));
EXPECT_CALL(*mockAmendmentCenterPtr_, isEnabled(_, Amendments::TokenEscrow, _)).WillOnce(Return(false));
EXPECT_CALL(*backend_, doFetchLedgerObject).Times(2);
static auto const kINPUT = json::parse(
@@ -613,6 +616,7 @@ TEST_F(RPCAccountInfoHandlerTest, Flags)
.WillByDefault(Return(accountRoot.getSerializer().peekData()));
EXPECT_CALL(*mockAmendmentCenterPtr_, isEnabled(_, Amendments::DisallowIncoming, _)).WillOnce(Return(false));
EXPECT_CALL(*mockAmendmentCenterPtr_, isEnabled(_, Amendments::Clawback, _)).WillOnce(Return(false));
EXPECT_CALL(*mockAmendmentCenterPtr_, isEnabled(_, Amendments::TokenEscrow, _)).WillOnce(Return(false));
EXPECT_CALL(*backend_, doFetchLedgerObject);
static auto const kINPUT = json::parse(
@@ -644,6 +648,7 @@ TEST_F(RPCAccountInfoHandlerTest, IdentAndSignerListsFalse)
.WillByDefault(Return(accountRoot.getSerializer().peekData()));
EXPECT_CALL(*mockAmendmentCenterPtr_, isEnabled(_, Amendments::DisallowIncoming, _)).WillOnce(Return(false));
EXPECT_CALL(*mockAmendmentCenterPtr_, isEnabled(_, Amendments::Clawback, _)).WillOnce(Return(false));
EXPECT_CALL(*mockAmendmentCenterPtr_, isEnabled(_, Amendments::TokenEscrow, _)).WillOnce(Return(false));
EXPECT_CALL(*backend_, doFetchLedgerObject);
static auto const kINPUT = json::parse(
@@ -724,6 +729,7 @@ TEST_F(RPCAccountInfoHandlerTest, DisallowIncoming)
.WillByDefault(Return(accountRoot.getSerializer().peekData()));
EXPECT_CALL(*mockAmendmentCenterPtr_, isEnabled(_, Amendments::DisallowIncoming, _)).WillOnce(Return(true));
EXPECT_CALL(*mockAmendmentCenterPtr_, isEnabled(_, Amendments::Clawback, _)).WillOnce(Return(false));
EXPECT_CALL(*mockAmendmentCenterPtr_, isEnabled(_, Amendments::TokenEscrow, _)).WillOnce(Return(false));
EXPECT_CALL(*backend_, doFetchLedgerObject);
static auto const kINPUT = json::parse(
@@ -742,14 +748,14 @@ TEST_F(RPCAccountInfoHandlerTest, DisallowIncoming)
});
}
TEST_F(RPCAccountInfoHandlerTest, Clawback)
TEST_F(RPCAccountInfoHandlerTest, AmendmentsEnabled)
{
auto const expectedOutput = fmt::format(
R"JSON({{
"account_data": {{
"Account": "{}",
"Balance": "200",
"Flags": 2180972544,
"Flags": 3254714368,
"LedgerEntryType": "AccountRoot",
"OwnerCount": 2,
"PreviousTxnID": "{}",
@@ -768,7 +774,8 @@ TEST_F(RPCAccountInfoHandlerTest, Clawback)
"passwordSpent": true,
"requireAuthorization": true,
"requireDestinationTag": true,
"allowTrustLineClawback": true
"allowTrustLineClawback": true,
"allowTrustLineLocking": true
}},
"ledger_hash": "{}",
"ledger_index": 30,
@@ -789,7 +796,7 @@ TEST_F(RPCAccountInfoHandlerTest, Clawback)
kACCOUNT,
ripple::lsfDefaultRipple | ripple::lsfGlobalFreeze | ripple::lsfRequireDestTag | ripple::lsfRequireAuth |
ripple::lsfDepositAuth | ripple::lsfDisableMaster | ripple::lsfDisallowXRP | ripple::lsfNoFreeze |
ripple::lsfPasswordSpent | ripple::lsfAllowTrustLineClawback,
ripple::lsfPasswordSpent | ripple::lsfAllowTrustLineClawback | ripple::lsfAllowTrustLineLocking,
2,
200,
2,
@@ -800,6 +807,7 @@ TEST_F(RPCAccountInfoHandlerTest, Clawback)
.WillByDefault(Return(accountRoot.getSerializer().peekData()));
EXPECT_CALL(*mockAmendmentCenterPtr_, isEnabled(_, Amendments::DisallowIncoming, _)).WillOnce(Return(false));
EXPECT_CALL(*mockAmendmentCenterPtr_, isEnabled(_, Amendments::Clawback, _)).WillOnce(Return(true));
EXPECT_CALL(*mockAmendmentCenterPtr_, isEnabled(_, Amendments::TokenEscrow, _)).WillOnce(Return(true));
EXPECT_CALL(*backend_, doFetchLedgerObject);
static auto const kINPUT = json::parse(