mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-20 02:55:50 +00:00
Enforce non-negative amounts
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user