Enforce defult rippling in VaultCreate::preclaim

This commit is contained in:
Bronek Kozicki
2025-05-01 21:11:16 +01:00
parent b3657220de
commit 140fd829a0
3 changed files with 49 additions and 16 deletions

View File

@@ -1090,22 +1090,44 @@ class Vault_test : public beast::unit_test::suite
{
using namespace test::jtx;
{
testcase("IOU fail create frozen");
Env env{*this, supported_amendments() | featureSingleAssetVault};
Account issuer{"issuer"};
Account owner{"owner"};
Account depositor{"depositor"};
env.fund(XRP(1000), issuer, owner, depositor);
env.close();
Vault vault{env};
Asset asset = issuer["IOU"];
{
testcase("IOU fail create frozen");
Env env{
*this, supported_amendments() | featureSingleAssetVault};
Account issuer{"issuer"};
Account owner{"owner"};
env.fund(XRP(1000), issuer, owner);
env.close();
env(fset(issuer, asfGlobalFreeze));
env.close();
auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
Vault vault{env};
Asset asset = issuer["IOU"];
auto [tx, keylet] =
vault.create({.owner = owner, .asset = asset});
env(fset(issuer, asfGlobalFreeze));
env.close();
env(tx, ter(tecFROZEN));
env.close();
env(tx, ter(tecFROZEN));
env.close();
}
{
testcase("IOU fail create no ripling");
Env env{
*this, supported_amendments() | featureSingleAssetVault};
Account issuer{"issuer"};
Account owner{"owner"};
env.fund(XRP(1000), issuer, owner);
env.close();
env(fclear(issuer, asfDefaultRipple));
env.close();
Vault vault{env};
Asset asset = issuer["IOU"];
auto [tx, keylet] =
vault.create({.owner = owner, .asset = asset});
env(tx, ter(terNO_RIPPLE));
env.close();
}
}
{

View File

@@ -100,7 +100,9 @@ VaultCreate::preclaim(PreclaimContext const& ctx)
auto vaultAsset = ctx.tx[sfAsset];
auto account = ctx.tx[sfAccount];
if (vaultAsset.holds<MPTIssue>())
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));
@@ -109,6 +111,15 @@ VaultCreate::preclaim(PreclaimContext const& ctx)
if ((issuance->getFlags() & lsfMPTCanTransfer) == 0)
return tecNO_AUTH;
}
else if (vaultAsset.holds<Issue>())
{
auto const issuer =
ctx.view.read(keylet::account(vaultAsset.getIssuer()));
if (!issuer)
return terNO_ACCOUNT; // LCOV_EXCL_LINE
else if (!issuer->isFlag(lsfDefaultRipple))
return terNO_RIPPLE;
}
// Check for pseudo-account issuers - we do not want a vault to hold such
// assets (e.g. MPT shares to other vaults or AMM LPTokens) as they would be

View File

@@ -1147,7 +1147,7 @@ addEmptyHolding(
auto const& issuerId = issue.getIssuer();
auto const& currency = issue.currency;
if (isGlobalFrozen(view, issuerId))
return tecFROZEN;
return tecINTERNAL; // LCOV_EXCL_LINE
auto const& srcId = issuerId;
auto const& dstId = accountID;