diff --git a/src/rpc/handlers/AccountInfo.cpp b/src/rpc/handlers/AccountInfo.cpp index 2984714f..15781a56 100644 --- a/src/rpc/handlers/AccountInfo.cpp +++ b/src/rpc/handlers/AccountInfo.cpp @@ -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) diff --git a/src/rpc/handlers/AccountInfo.hpp b/src/rpc/handlers/AccountInfo.hpp index ae74b6c8..263516df 100644 --- a/src/rpc/handlers/AccountInfo.hpp +++ b/src/rpc/handlers/AccountInfo.hpp @@ -61,6 +61,7 @@ public: ripple::STLedgerEntry accountData; bool isDisallowIncomingEnabled = false; bool isClawbackEnabled = false; + bool isTokenEscrowEnabled = false; uint32_t apiVersion; std::optional> 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> signerLists = std::nullopt ) @@ -91,6 +94,7 @@ public: , accountData(std::move(sle)) , isDisallowIncomingEnabled(isDisallowIncomingEnabled) , isClawbackEnabled(isClawbackEnabled) + , isTokenEscrowEnabled(isTokenEscrowEnabled) , apiVersion(version) , signerLists(std::move(signerLists)) { diff --git a/tests/unit/rpc/handlers/AccountInfoTests.cpp b/tests/unit/rpc/handlers/AccountInfoTests.cpp index 5e9b05d2..858bc389 100644 --- a/tests/unit/rpc/handlers/AccountInfoTests.cpp +++ b/tests/unit/rpc/handlers/AccountInfoTests.cpp @@ -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(