Enforce non-negative amounts

This commit is contained in:
Bronek Kozicki
2025-02-25 19:37:01 +00:00
parent a0632a0cb3
commit 04503c9fa4
4 changed files with 60 additions and 0 deletions

View File

@@ -59,6 +59,25 @@ class Vault_test : public beast::unit_test::suite
env(tx, ter(tecINSUFFICIENT_FUNDS));
}
{
testcase(prefix + " fail to deposit negative amount");
auto tx = vault.deposit(
{.depositor = depositor,
.id = keylet.key,
.amount = PrettyAmount(
STAmount(asset.raw(), 1ul, 0, true), "")});
env(tx, ter(temBAD_AMOUNT));
}
{
testcase(prefix + " fail to deposit zero amount");
auto tx = vault.deposit(
{.depositor = depositor,
.id = keylet.key,
.amount = asset(0)});
env(tx, ter(temBAD_AMOUNT));
}
{
testcase(prefix + " deposit non-zero amount");
auto tx = vault.deposit(
@@ -120,6 +139,25 @@ class Vault_test : public beast::unit_test::suite
env(tx, ter(tecLIMIT_EXCEEDED));
}
{
testcase(prefix + " fail to withdraw negative amount");
auto tx = vault.withdraw(
{.depositor = depositor,
.id = keylet.key,
.amount = PrettyAmount(
STAmount(asset.raw(), 1ul, 0, true), "")});
env(tx, ter(temBAD_AMOUNT));
}
{
testcase(prefix + " fail to withdraw zero amount");
auto tx = vault.withdraw(
{.depositor = depositor,
.id = keylet.key,
.amount = asset(0)});
env(tx, ter(temBAD_AMOUNT));
}
{
testcase(prefix + " fail to withdraw more than assets held");
auto tx = vault.withdraw(
@@ -149,6 +187,17 @@ class Vault_test : public beast::unit_test::suite
env(tx, ter(tecNO_PERMISSION));
}
{
testcase(prefix + " fail to clawback negative amount");
auto tx = vault.clawback(
{.issuer = issuer,
.id = keylet.key,
.holder = depositor,
.amount = PrettyAmount(
STAmount(asset.raw(), 1ul, 0, true), "")});
env(tx, ter(temBAD_AMOUNT));
}
{
testcase(prefix + " clawback");
auto code = asset.raw().native() ? ter(tecNO_PERMISSION)

View File

@@ -23,6 +23,7 @@
#include <xrpl/beast/utility/instrumentation.h>
#include <xrpl/protocol/Feature.h>
#include <xrpl/protocol/STNumber.h>
#include <xrpl/protocol/TER.h>
#include <xrpl/protocol/TxFlags.h>
namespace ripple {
@@ -39,6 +40,10 @@ VaultClawback::preflight(PreflightContext const& ctx)
if (ctx.tx.getFlags() & tfUniversalMask)
return temINVALID_FLAG;
// Note, zero amount is valid, it means "all". It is also the default.
if (ctx.tx[sfAmount] < beast::zero)
return temBAD_AMOUNT;
return preflight2(ctx);
}

View File

@@ -44,6 +44,9 @@ VaultDeposit::preflight(PreflightContext const& ctx)
if (ctx.tx.getFlags() & tfUniversalMask)
return temINVALID_FLAG;
if (ctx.tx[sfAmount] <= beast::zero)
return temBAD_AMOUNT;
return preflight2(ctx);
}

View File

@@ -41,6 +41,9 @@ VaultWithdraw::preflight(PreflightContext const& ctx)
if (ctx.tx.getFlags() & tfUniversalMask)
return temINVALID_FLAG;
if (ctx.tx[sfAmount] <= beast::zero)
return temBAD_AMOUNT;
return preflight2(ctx);
}