Switch 'vault not found' to tecNO_ENTRY

This commit is contained in:
Bronek Kozicki
2025-03-26 19:07:10 +00:00
parent dee06df012
commit 2e13dc1e85
7 changed files with 105 additions and 16 deletions

View File

@@ -419,6 +419,49 @@ class Vault_test : public beast::unit_test::suite
test(env, issuer, owner, depositor, asset, vault);
};
testCase([this](
Env& env,
Account const& issuer,
Account const& owner,
Account const& depositor,
PrettyAsset const& asset,
Vault& vault) {
testcase("nothing to set");
auto tx = vault.set({.owner = owner, .id = keylet::skip().key});
tx[sfAssetMaximum] = asset(0).number();
env(tx, ter(tecNO_ENTRY));
});
testCase([this](
Env& env,
Account const& issuer,
Account const& owner,
Account const& depositor,
PrettyAsset const& asset,
Vault& vault) {
testcase("nothing to deposit to");
auto tx = vault.deposit(
{.depositor = depositor,
.id = keylet::skip().key,
.amount = asset(10)});
env(tx, ter(tecNO_ENTRY));
});
testCase([this](
Env& env,
Account const& issuer,
Account const& owner,
Account const& depositor,
PrettyAsset const& asset,
Vault& vault) {
testcase("nothing to withdraw from");
auto tx = vault.withdraw(
{.depositor = depositor,
.id = keylet::skip().key,
.amount = asset(10)});
env(tx, ter(tecNO_ENTRY));
});
testCase([this](
Env& env,
Account const& issuer,
@@ -427,8 +470,8 @@ class Vault_test : public beast::unit_test::suite
Asset const& asset,
Vault& vault) {
testcase("nothing to delete");
auto tx = vault.del({.owner = issuer, .id = keylet::skip().key});
env(tx, ter(tecOBJECT_NOT_FOUND));
auto tx = vault.del({.owner = owner, .id = keylet::skip().key});
env(tx, ter(tecNO_ENTRY));
});
testCase([this](
@@ -552,6 +595,34 @@ class Vault_test : public beast::unit_test::suite
tx[sfMPTokenMetadata] = std::string(2050, 'B');
env(tx, ter(temMALFORMED));
});
testCase([this](
Env& env,
Account const& issuer,
Account const& owner,
Account const& depositor,
Asset const& asset,
Vault& vault) {
auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
tx[sfFlags] = tfVaultPrivate;
tx[sfDomainID] = to_string(base_uint<256>(0));
testcase("invalid zero domain");
env(tx, ter{temMALFORMED});
});
testCase([this](
Env& env,
Account const& issuer,
Account const& owner,
Account const& depositor,
Asset const& asset,
Vault& vault) {
auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
tx[sfFlags] = tfVaultPrivate;
tx[sfDomainID] = to_string(base_uint<256>(42ul));
testcase("non-existing domain");
env(tx, ter{tecOBJECT_NOT_FOUND});
});
}
void
@@ -742,6 +813,23 @@ class Vault_test : public beast::unit_test::suite
test(env, issuer, owner, depositor, asset, vault, mptt);
};
testCase([this](
Env& env,
Account const& issuer,
Account const& owner,
Account const& depositor,
PrettyAsset const& asset,
Vault& vault,
MPTTester& mptt) {
testcase("nothing to clawback from");
auto tx = vault.clawback(
{.issuer = issuer,
.id = keylet::skip().key,
.holder = depositor,
.amount = asset(10)});
env(tx, ter(tecNO_ENTRY));
});
testCase([this](
Env& env,
Account const& issuer,

View File

@@ -71,7 +71,7 @@ VaultClawback::preclaim(PreclaimContext const& ctx)
{
auto const vault = ctx.view.read(keylet::vault(ctx.tx[sfVaultID]));
if (!vault)
return tecOBJECT_NOT_FOUND;
return tecNO_ENTRY;
auto account = ctx.tx[sfAccount];
auto const issuer = ctx.view.read(keylet::account(account));
@@ -117,7 +117,7 @@ VaultClawback::doApply()
auto const& tx = ctx_.tx;
auto const vault = view().peek(keylet::vault(tx[sfVaultID]));
if (!vault)
return tecOBJECT_NOT_FOUND;
return tefINTERNAL; // Enforced in preclaim
auto const mptIssuanceID = (*vault)[sfMPTokenIssuanceID];
auto const sleIssuance = view().read(keylet::mptIssuance(mptIssuanceID));

View File

@@ -102,7 +102,7 @@ VaultCreate::preclaim(PreclaimContext const& ctx)
auto mptID = asset.get<MPTIssue>().getMptID();
auto issuance = ctx.view.read(keylet::mptIssuance(mptID));
if (!issuance)
return tecNO_ENTRY;
return tecOBJECT_NOT_FOUND;
if ((issuance->getFlags() & lsfMPTCanTransfer) == 0)
return tecNO_AUTH;
}
@@ -116,7 +116,7 @@ VaultCreate::preclaim(PreclaimContext const& ctx)
auto const sleDomain =
ctx.view.read(keylet::permissionedDomain(*domain));
if (!sleDomain)
return tecNO_ENTRY;
return tecOBJECT_NOT_FOUND;
}
return tesSUCCESS;

View File

@@ -23,6 +23,7 @@
#include <xrpl/protocol/Feature.h>
#include <xrpl/protocol/STNumber.h>
#include <xrpl/protocol/TER.h>
#include <xrpl/protocol/TxFlags.h>
namespace ripple {
@@ -50,7 +51,7 @@ VaultDelete::preclaim(PreclaimContext const& ctx)
{
auto const vault = ctx.view.read(keylet::vault(ctx.tx[sfVaultID]));
if (!vault)
return tecOBJECT_NOT_FOUND;
return tecNO_ENTRY;
if (vault->at(sfOwner) != ctx.tx[sfAccount])
return tecNO_PERMISSION;
@@ -66,7 +67,7 @@ VaultDelete::doApply()
{
auto const vault = view().peek(keylet::vault(ctx_.tx[sfVaultID]));
if (!vault)
return tefINTERNAL;
return tefINTERNAL; // Enforced in preclaim
// Destroy the asset holding.
if (auto ter = removeEmptyHolding(

View File

@@ -58,7 +58,7 @@ VaultDeposit::preclaim(PreclaimContext const& ctx)
{
auto const vault = ctx.view.read(keylet::vault(ctx.tx[sfVaultID]));
if (!vault)
return tecOBJECT_NOT_FOUND;
return tecNO_ENTRY;
auto const account = ctx.tx[sfAccount];
auto const assets = ctx.tx[sfAmount];
@@ -99,7 +99,7 @@ VaultDeposit::preclaim(PreclaimContext const& ctx)
auto mptID = assets.get<MPTIssue>().getMptID();
auto issuance = ctx.view.read(keylet::mptIssuance(mptID));
if (!issuance)
return tecNO_ENTRY;
return tecOBJECT_NOT_FOUND;
if ((issuance->getFlags() & lsfMPTCanTransfer) == 0)
return tecNO_AUTH;
}
@@ -121,7 +121,7 @@ VaultDeposit::doApply()
{
auto const vault = view().peek(keylet::vault(ctx_.tx[sfVaultID]));
if (!vault)
return tefINTERNAL;
return tefINTERNAL; // Enforced in preclaim
auto const assets = ctx_.tx[sfAmount];

View File

@@ -80,7 +80,7 @@ VaultSet::preclaim(PreclaimContext const& ctx)
{
auto const vault = ctx.view.read(keylet::vault(ctx.tx[sfVaultID]));
if (!vault)
return tecOBJECT_NOT_FOUND;
return tecNO_ENTRY;
// Assert that submitter is the Owner.
if (ctx.tx[sfAccount] != vault->at(sfOwner))
@@ -120,9 +120,9 @@ VaultSet::doApply()
auto const& tx = ctx_.tx;
// Update existing object.
auto vault = view().peek({ltVAULT, tx[sfVaultID]});
auto vault = view().peek(keylet::vault(tx[sfVaultID]));
if (!vault)
return tecOBJECT_NOT_FOUND;
return tefINTERNAL; // Enforced in preclaim
auto const mptIssuanceID = (*vault)[sfMPTokenIssuanceID];
auto const sleIssuance = view().peek(keylet::mptIssuance(mptIssuanceID));

View File

@@ -63,7 +63,7 @@ VaultWithdraw::preclaim(PreclaimContext const& ctx)
{
auto const vault = ctx.view.read(keylet::vault(ctx.tx[sfVaultID]));
if (!vault)
return tecOBJECT_NOT_FOUND;
return tecNO_ENTRY;
if (ctx.tx.isFieldPresent(sfDestination))
{
@@ -95,7 +95,7 @@ VaultWithdraw::preclaim(PreclaimContext const& ctx)
auto mptID = assets.get<MPTIssue>().getMptID();
auto issuance = ctx.view.read(keylet::mptIssuance(mptID));
if (!issuance)
return tecNO_ENTRY;
return tecOBJECT_NOT_FOUND;
if ((issuance->getFlags() & lsfMPTCanTransfer) == 0)
return tecNO_AUTH;
}