Add defensive checks for IOU issuer and MPTokenIssuance

This commit is contained in:
Bronek Kozicki
2025-05-02 16:56:47 +01:00
parent a87f58eb22
commit 84abcba497
2 changed files with 34 additions and 0 deletions

View File

@@ -66,6 +66,23 @@ VaultDeposit::preclaim(PreclaimContext const& ctx)
if (assets.asset() != vaultAsset)
return tecWRONG_ASSET;
if (vaultAsset.native())
; // No special checks for XRP
else if (vaultAsset.holds<MPTIssue>())
{
auto mptID = vaultAsset.get<MPTIssue>().getMptID();
auto issuance = ctx.view.read(keylet::mptIssuance(mptID));
if (!issuance)
return tecOBJECT_NOT_FOUND;
}
else if (vaultAsset.holds<Issue>())
{
auto const issuer =
ctx.view.read(keylet::account(vaultAsset.getIssuer()));
if (!issuer)
return tefINTERNAL; // LCOV_EXCL_LINE
}
auto const mptIssuanceID = vault->at(sfShareMPTID);
auto const vaultShare = MPTIssue(mptIssuanceID);
if (vaultShare == assets.asset())

View File

@@ -68,6 +68,23 @@ VaultWithdraw::preclaim(PreclaimContext const& ctx)
if (assets.asset() != vaultAsset && assets.asset() != vaultShare)
return tecWRONG_ASSET;
if (vaultAsset.native())
; // No special checks for XRP
else if (vaultAsset.holds<MPTIssue>())
{
auto mptID = vaultAsset.get<MPTIssue>().getMptID();
auto issuance = ctx.view.read(keylet::mptIssuance(mptID));
if (!issuance)
return tecOBJECT_NOT_FOUND;
}
else if (vaultAsset.holds<Issue>())
{
auto const issuer =
ctx.view.read(keylet::account(vaultAsset.getIssuer()));
if (!issuer)
return tefINTERNAL; // LCOV_EXCL_LINE
}
// Enforce valid withdrawal policy
if (vault->at(sfWithdrawalPolicy) != vaultStrategyFirstComeFirstServe)
return tefINTERNAL; // LCOV_EXCL_LINE