Skip to content

Commit 7b5680f

Browse files
committed
Fix VaultClawback and unit test
1 parent b397524 commit 7b5680f

File tree

2 files changed

+14
-7
lines changed

2 files changed

+14
-7
lines changed

src/test/app/Vault_test.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,9 @@ class Vault_test : public beast::unit_test::suite
321321
Account const& issuer,
322322
Account const& depositor) -> Asset {
323323
MPTTester mptt{env, issuer, mptInitNoFund};
324-
mptt.create({.flags = tfMPTCanTransfer | tfMPTCanLock});
324+
mptt.create(
325+
{.flags =
326+
tfMPTCanClawback | tfMPTCanTransfer | tfMPTCanLock});
325327
PrettyAsset asset = mptt.issuanceID();
326328
mptt.authorize({.account = depositor});
327329
env(pay(issuer, depositor, asset(1000)));

src/xrpld/app/tx/detail/VaultClawback.cpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,16 +85,21 @@ VaultClawback::preclaim(PreclaimContext const& ctx)
8585
if (amount && asset != amount->asset())
8686
return tecWRONG_ASSET;
8787

88-
std::uint32_t const issuerFlags = issuer->getFieldU32(sfFlags);
89-
90-
if (asset.holds<Issue>())
88+
if (asset.holds<MPTIssue>())
9189
{
92-
if (!(issuerFlags & lsfMPTCanClawback) ||
93-
!(issuerFlags & lsfMPTCanLock))
90+
auto const mpt = asset.get<MPTIssue>();
91+
auto const mptIssue =
92+
ctx.view.read(keylet::mptIssuance(mpt.getMptID()));
93+
if (mptIssue == nullptr)
94+
return tecWRONG_ASSET;
95+
96+
std::uint32_t const issueFlags = mptIssue->getFieldU32(sfFlags);
97+
if (!(issueFlags & lsfMPTCanClawback) || !(issueFlags & lsfMPTCanLock))
9498
return tecNO_PERMISSION;
9599
}
96-
else if (asset.holds<MPTIssue>())
100+
else if (asset.holds<Issue>())
97101
{
102+
std::uint32_t const issuerFlags = issuer->getFieldU32(sfFlags);
98103
if (!(issuerFlags & lsfAllowTrustLineClawback) ||
99104
(issuerFlags & lsfNoFreeze))
100105
return tecNO_PERMISSION;

0 commit comments

Comments
 (0)