From 7b5680f53662652368b9695223b31a8db033c1f6 Mon Sep 17 00:00:00 2001 From: Bronek Kozicki Date: Thu, 13 Mar 2025 17:24:05 +0000 Subject: [PATCH] Fix VaultClawback and unit test --- src/test/app/Vault_test.cpp | 4 +++- src/xrpld/app/tx/detail/VaultClawback.cpp | 17 +++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/test/app/Vault_test.cpp b/src/test/app/Vault_test.cpp index 9e8c042a25..713f565a53 100644 --- a/src/test/app/Vault_test.cpp +++ b/src/test/app/Vault_test.cpp @@ -321,7 +321,9 @@ class Vault_test : public beast::unit_test::suite Account const& issuer, Account const& depositor) -> Asset { MPTTester mptt{env, issuer, mptInitNoFund}; - mptt.create({.flags = tfMPTCanTransfer | tfMPTCanLock}); + mptt.create( + {.flags = + tfMPTCanClawback | tfMPTCanTransfer | tfMPTCanLock}); PrettyAsset asset = mptt.issuanceID(); mptt.authorize({.account = depositor}); env(pay(issuer, depositor, asset(1000))); diff --git a/src/xrpld/app/tx/detail/VaultClawback.cpp b/src/xrpld/app/tx/detail/VaultClawback.cpp index 5d3f302b33..aae03247ab 100644 --- a/src/xrpld/app/tx/detail/VaultClawback.cpp +++ b/src/xrpld/app/tx/detail/VaultClawback.cpp @@ -85,16 +85,21 @@ VaultClawback::preclaim(PreclaimContext const& ctx) if (amount && asset != amount->asset()) return tecWRONG_ASSET; - std::uint32_t const issuerFlags = issuer->getFieldU32(sfFlags); - - if (asset.holds()) + if (asset.holds()) { - if (!(issuerFlags & lsfMPTCanClawback) || - !(issuerFlags & lsfMPTCanLock)) + auto const mpt = asset.get(); + auto const mptIssue = + ctx.view.read(keylet::mptIssuance(mpt.getMptID())); + if (mptIssue == nullptr) + return tecWRONG_ASSET; + + std::uint32_t const issueFlags = mptIssue->getFieldU32(sfFlags); + if (!(issueFlags & lsfMPTCanClawback) || !(issueFlags & lsfMPTCanLock)) return tecNO_PERMISSION; } - else if (asset.holds()) + else if (asset.holds()) { + std::uint32_t const issuerFlags = issuer->getFieldU32(sfFlags); if (!(issuerFlags & lsfAllowTrustLineClawback) || (issuerFlags & lsfNoFreeze)) return tecNO_PERMISSION;