diff --git a/src/test/app/Vault_test.cpp b/src/test/app/Vault_test.cpp index dd68b2c1a8..35c91440db 100644 --- a/src/test/app/Vault_test.cpp +++ b/src/test/app/Vault_test.cpp @@ -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, diff --git a/src/xrpld/app/tx/detail/VaultClawback.cpp b/src/xrpld/app/tx/detail/VaultClawback.cpp index 87c6eb726b..4cd9b261c7 100644 --- a/src/xrpld/app/tx/detail/VaultClawback.cpp +++ b/src/xrpld/app/tx/detail/VaultClawback.cpp @@ -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)); diff --git a/src/xrpld/app/tx/detail/VaultCreate.cpp b/src/xrpld/app/tx/detail/VaultCreate.cpp index a5274dfa33..37417ea96d 100644 --- a/src/xrpld/app/tx/detail/VaultCreate.cpp +++ b/src/xrpld/app/tx/detail/VaultCreate.cpp @@ -102,7 +102,7 @@ VaultCreate::preclaim(PreclaimContext const& ctx) auto mptID = asset.get().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; diff --git a/src/xrpld/app/tx/detail/VaultDelete.cpp b/src/xrpld/app/tx/detail/VaultDelete.cpp index 96b2fa60db..5349cd87fd 100644 --- a/src/xrpld/app/tx/detail/VaultDelete.cpp +++ b/src/xrpld/app/tx/detail/VaultDelete.cpp @@ -23,6 +23,7 @@ #include #include +#include #include 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( diff --git a/src/xrpld/app/tx/detail/VaultDeposit.cpp b/src/xrpld/app/tx/detail/VaultDeposit.cpp index b484b7bfe0..9cd8d59871 100644 --- a/src/xrpld/app/tx/detail/VaultDeposit.cpp +++ b/src/xrpld/app/tx/detail/VaultDeposit.cpp @@ -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().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]; diff --git a/src/xrpld/app/tx/detail/VaultSet.cpp b/src/xrpld/app/tx/detail/VaultSet.cpp index 4d6b9df047..e874492548 100644 --- a/src/xrpld/app/tx/detail/VaultSet.cpp +++ b/src/xrpld/app/tx/detail/VaultSet.cpp @@ -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)); diff --git a/src/xrpld/app/tx/detail/VaultWithdraw.cpp b/src/xrpld/app/tx/detail/VaultWithdraw.cpp index 5c8c3e2779..0bf84a6375 100644 --- a/src/xrpld/app/tx/detail/VaultWithdraw.cpp +++ b/src/xrpld/app/tx/detail/VaultWithdraw.cpp @@ -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().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; }