mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-20 11:05:54 +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));
|
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");
|
testcase(prefix + " deposit non-zero amount");
|
||||||
auto tx = vault.deposit(
|
auto tx = vault.deposit(
|
||||||
@@ -120,6 +139,25 @@ class Vault_test : public beast::unit_test::suite
|
|||||||
env(tx, ter(tecLIMIT_EXCEEDED));
|
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");
|
testcase(prefix + " fail to withdraw more than assets held");
|
||||||
auto tx = vault.withdraw(
|
auto tx = vault.withdraw(
|
||||||
@@ -149,6 +187,17 @@ class Vault_test : public beast::unit_test::suite
|
|||||||
env(tx, ter(tecNO_PERMISSION));
|
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");
|
testcase(prefix + " clawback");
|
||||||
auto code = asset.raw().native() ? ter(tecNO_PERMISSION)
|
auto code = asset.raw().native() ? ter(tecNO_PERMISSION)
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
#include <xrpl/beast/utility/instrumentation.h>
|
#include <xrpl/beast/utility/instrumentation.h>
|
||||||
#include <xrpl/protocol/Feature.h>
|
#include <xrpl/protocol/Feature.h>
|
||||||
#include <xrpl/protocol/STNumber.h>
|
#include <xrpl/protocol/STNumber.h>
|
||||||
|
#include <xrpl/protocol/TER.h>
|
||||||
#include <xrpl/protocol/TxFlags.h>
|
#include <xrpl/protocol/TxFlags.h>
|
||||||
|
|
||||||
namespace ripple {
|
namespace ripple {
|
||||||
@@ -39,6 +40,10 @@ VaultClawback::preflight(PreflightContext const& ctx)
|
|||||||
if (ctx.tx.getFlags() & tfUniversalMask)
|
if (ctx.tx.getFlags() & tfUniversalMask)
|
||||||
return temINVALID_FLAG;
|
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);
|
return preflight2(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -44,6 +44,9 @@ VaultDeposit::preflight(PreflightContext const& ctx)
|
|||||||
if (ctx.tx.getFlags() & tfUniversalMask)
|
if (ctx.tx.getFlags() & tfUniversalMask)
|
||||||
return temINVALID_FLAG;
|
return temINVALID_FLAG;
|
||||||
|
|
||||||
|
if (ctx.tx[sfAmount] <= beast::zero)
|
||||||
|
return temBAD_AMOUNT;
|
||||||
|
|
||||||
return preflight2(ctx);
|
return preflight2(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -41,6 +41,9 @@ VaultWithdraw::preflight(PreflightContext const& ctx)
|
|||||||
if (ctx.tx.getFlags() & tfUniversalMask)
|
if (ctx.tx.getFlags() & tfUniversalMask)
|
||||||
return temINVALID_FLAG;
|
return temINVALID_FLAG;
|
||||||
|
|
||||||
|
if (ctx.tx[sfAmount] <= beast::zero)
|
||||||
|
return temBAD_AMOUNT;
|
||||||
|
|
||||||
return preflight2(ctx);
|
return preflight2(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user