diff --git a/src/test/app/Vault_test.cpp b/src/test/app/Vault_test.cpp index 9293ace196..544c4af4c2 100644 --- a/src/test/app/Vault_test.cpp +++ b/src/test/app/Vault_test.cpp @@ -101,6 +101,15 @@ class Vault_test : public beast::unit_test::suite env(tx, ter(temBAD_AMOUNT)); } + { + testcase(prefix + " fail to deposit to zero vaultID"); + auto tx = vault.deposit( + {.depositor = depositor, + .id = beast::zero, + .amount = asset(10)}); + env(tx, ter(temMALFORMED)); + } + { testcase(prefix + " deposit non-zero amount"); auto tx = vault.deposit( @@ -147,6 +156,13 @@ class Vault_test : public beast::unit_test::suite env(tx, ter(tecLIMIT_EXCEEDED)); } + { + testcase(prefix + " fail to set zero vault"); + auto tx = vault.set({.owner = owner, .id = beast::zero}); + tx[sfAssetMaximum] = asset(150).number(); + env(tx, ter(temMALFORMED)); + } + { testcase(prefix + " set maximum higher than current amount"); auto tx = vault.set({.owner = owner, .id = keylet.key}); @@ -253,6 +269,17 @@ class Vault_test : public beast::unit_test::suite env(tx, code); } + if (!asset.raw().native()) + { + testcase(prefix + " fail to clawback zero vault"); + auto tx = vault.clawback( + {.issuer = issuer, + .id = beast::zero, + .holder = depositor, + .amount = asset(10)}); + env(tx, ter(temMALFORMED)); + } + { testcase(prefix + " clawback all"); auto code = asset.raw().native() ? ter(tecNO_PERMISSION) @@ -272,6 +299,15 @@ class Vault_test : public beast::unit_test::suite env(tx); } + { + testcase(prefix + " fail to withdraw zero vault"); + auto tx = vault.withdraw( + {.depositor = depositor, + .id = beast::zero, + .amount = asset(100)}); + env(tx, ter(temMALFORMED)); + } + { testcase(prefix + " withdraw non-zero assets"); auto tx = vault.withdraw( @@ -287,6 +323,12 @@ class Vault_test : public beast::unit_test::suite env(tx, ter(tecNO_PERMISSION)); } + { + testcase(prefix + " fail to delete zero vault"); + auto tx = vault.del({.owner = owner, .id = beast::zero}); + env(tx, ter(temMALFORMED)); + } + { testcase(prefix + " delete empty vault"); auto tx = vault.del({.owner = owner, .id = keylet.key}); diff --git a/src/xrpld/app/tx/detail/VaultClawback.cpp b/src/xrpld/app/tx/detail/VaultClawback.cpp index cf43b56560..87c6eb726b 100644 --- a/src/xrpld/app/tx/detail/VaultClawback.cpp +++ b/src/xrpld/app/tx/detail/VaultClawback.cpp @@ -42,6 +42,9 @@ VaultClawback::preflight(PreflightContext const& ctx) if (ctx.tx.getFlags() & tfUniversalMask) return temINVALID_FLAG; + if (ctx.tx[sfVaultID] == beast::zero) + return temMALFORMED; + AccountID const issuer = ctx.tx[sfAccount]; AccountID const holder = ctx.tx[sfHolder]; diff --git a/src/xrpld/app/tx/detail/VaultDelete.cpp b/src/xrpld/app/tx/detail/VaultDelete.cpp index 9c444b9c0d..96b2fa60db 100644 --- a/src/xrpld/app/tx/detail/VaultDelete.cpp +++ b/src/xrpld/app/tx/detail/VaultDelete.cpp @@ -39,6 +39,9 @@ VaultDelete::preflight(PreflightContext const& ctx) if (ctx.tx.getFlags() & tfUniversalMask) return temINVALID_FLAG; + if (ctx.tx[sfVaultID] == beast::zero) + return temMALFORMED; + return preflight2(ctx); } diff --git a/src/xrpld/app/tx/detail/VaultDeposit.cpp b/src/xrpld/app/tx/detail/VaultDeposit.cpp index ec9dcb0c9b..b484b7bfe0 100644 --- a/src/xrpld/app/tx/detail/VaultDeposit.cpp +++ b/src/xrpld/app/tx/detail/VaultDeposit.cpp @@ -44,6 +44,9 @@ VaultDeposit::preflight(PreflightContext const& ctx) if (ctx.tx.getFlags() & tfUniversalMask) return temINVALID_FLAG; + if (ctx.tx[sfVaultID] == beast::zero) + return temMALFORMED; + if (ctx.tx[sfAmount] <= beast::zero) return temBAD_AMOUNT; diff --git a/src/xrpld/app/tx/detail/VaultSet.cpp b/src/xrpld/app/tx/detail/VaultSet.cpp index 9419fe0902..c8feba2e9f 100644 --- a/src/xrpld/app/tx/detail/VaultSet.cpp +++ b/src/xrpld/app/tx/detail/VaultSet.cpp @@ -43,6 +43,9 @@ VaultSet::preflight(PreflightContext const& ctx) if (auto const ter = preflight1(ctx)) return ter; + if (ctx.tx[sfVaultID] == beast::zero) + return temMALFORMED; + if (ctx.tx.getFlags() & tfUniversalMask) return temINVALID_FLAG; diff --git a/src/xrpld/app/tx/detail/VaultWithdraw.cpp b/src/xrpld/app/tx/detail/VaultWithdraw.cpp index fe3e30a0c9..5c8c3e2779 100644 --- a/src/xrpld/app/tx/detail/VaultWithdraw.cpp +++ b/src/xrpld/app/tx/detail/VaultWithdraw.cpp @@ -42,6 +42,9 @@ VaultWithdraw::preflight(PreflightContext const& ctx) if (ctx.tx.getFlags() & tfUniversalMask) return temINVALID_FLAG; + if (ctx.tx[sfVaultID] == beast::zero) + return temMALFORMED; + if (ctx.tx[sfAmount] <= beast::zero) return temBAD_AMOUNT;