2#include <xrpl/basics/Number.h>
3#include <xrpl/basics/base_uint.h>
4#include <xrpl/basics/random.h>
5#include <xrpl/beast/hash/uhash.h>
6#include <xrpl/beast/unit_test/suite.h>
7#include <xrpl/beast/utility/Zero.h>
8#include <xrpl/json/json_forwards.h>
9#include <xrpl/json/json_value.h>
10#include <xrpl/protocol/AccountID.h>
11#include <xrpl/protocol/Feature.h>
12#include <xrpl/protocol/IOUAmount.h>
13#include <xrpl/protocol/Indexes.h>
14#include <xrpl/protocol/Issue.h>
15#include <xrpl/protocol/MPTAmount.h>
16#include <xrpl/protocol/MPTIssue.h>
17#include <xrpl/protocol/Rate.h>
18#include <xrpl/protocol/Rules.h>
19#include <xrpl/protocol/SField.h>
20#include <xrpl/protocol/STAmount.h>
21#include <xrpl/protocol/Serializer.h>
22#include <xrpl/protocol/UintTypes.h>
23#include <xrpl/protocol/XRPAmount.h>
74 if (valueDigits == 999999999)
102 BEAST_EXPECT(!res.
native());
106 BEAST_EXPECT(!cmp.
native());
126 BEAST_EXPECT(!prod1.
native());
135 fail(
"Multiplication result is not exact");
147 BEAST_EXPECT(amount.
getText() == value);
151 BEAST_EXPECT(!success);
240 unexpected((zeroSt < zeroSt),
"STAmount fail");
242 unexpected(!(zeroSt < hundred),
"STAmount fail");
245 unexpected(!(one < hundred),
"STAmount fail");
246 unexpected((hundred < zeroSt),
"STAmount fail");
248 unexpected((hundred < hundred),
"STAmount fail");
249 unexpected((zeroSt > zeroSt),
"STAmount fail");
251 unexpected((zeroSt > hundred),
"STAmount fail");
255 unexpected(!(hundred > zeroSt),
"STAmount fail");
256 unexpected(!(hundred > one),
"STAmount fail");
257 unexpected((hundred > hundred),
"STAmount fail");
258 unexpected(!(zeroSt <= zeroSt),
"STAmount fail");
259 unexpected(!(zeroSt <= one),
"STAmount fail");
260 unexpected(!(zeroSt <= hundred),
"STAmount fail");
263 unexpected(!(one <= hundred),
"STAmount fail");
264 unexpected((hundred <= zeroSt),
"STAmount fail");
265 unexpected((hundred <= one),
"STAmount fail");
266 unexpected(!(hundred <= hundred),
"STAmount fail");
267 unexpected(!(zeroSt >= zeroSt),
"STAmount fail");
269 unexpected((zeroSt >= hundred),
"STAmount fail");
270 unexpected(!(one >= zeroSt),
"STAmount fail");
272 unexpected((one >= hundred),
"STAmount fail");
273 unexpected(!(hundred >= zeroSt),
"STAmount fail");
274 unexpected(!(hundred >= one),
"STAmount fail");
275 unexpected(!(hundred >= hundred),
"STAmount fail");
276 unexpected(!(zeroSt == zeroSt),
"STAmount fail");
278 unexpected((zeroSt == hundred),
"STAmount fail");
281 unexpected((one == hundred),
"STAmount fail");
282 unexpected((hundred == zeroSt),
"STAmount fail");
283 unexpected((hundred == one),
"STAmount fail");
284 unexpected(!(hundred == hundred),
"STAmount fail");
285 unexpected((zeroSt != zeroSt),
"STAmount fail");
286 unexpected(!(zeroSt != one),
"STAmount fail");
287 unexpected(!(zeroSt != hundred),
"STAmount fail");
288 unexpected(!(one != zeroSt),
"STAmount fail");
290 unexpected(!(one != hundred),
"STAmount fail");
291 unexpected(!(hundred != zeroSt),
"STAmount fail");
292 unexpected(!(hundred != one),
"STAmount fail");
293 unexpected((hundred != hundred),
"STAmount fail");
302 std::string const cur =
"015841551A748AD2C1F76FF6ECB0CCCD00000000";
326 unexpected((zeroSt < zeroSt),
"STAmount fail");
328 unexpected(!(zeroSt < hundred),
"STAmount fail");
331 unexpected(!(one < hundred),
"STAmount fail");
332 unexpected((hundred < zeroSt),
"STAmount fail");
334 unexpected((hundred < hundred),
"STAmount fail");
335 unexpected((zeroSt > zeroSt),
"STAmount fail");
337 unexpected((zeroSt > hundred),
"STAmount fail");
341 unexpected(!(hundred > zeroSt),
"STAmount fail");
342 unexpected(!(hundred > one),
"STAmount fail");
343 unexpected((hundred > hundred),
"STAmount fail");
344 unexpected(!(zeroSt <= zeroSt),
"STAmount fail");
345 unexpected(!(zeroSt <= one),
"STAmount fail");
346 unexpected(!(zeroSt <= hundred),
"STAmount fail");
349 unexpected(!(one <= hundred),
"STAmount fail");
350 unexpected((hundred <= zeroSt),
"STAmount fail");
351 unexpected((hundred <= one),
"STAmount fail");
352 unexpected(!(hundred <= hundred),
"STAmount fail");
353 unexpected(!(zeroSt >= zeroSt),
"STAmount fail");
355 unexpected((zeroSt >= hundred),
"STAmount fail");
356 unexpected(!(one >= zeroSt),
"STAmount fail");
358 unexpected((one >= hundred),
"STAmount fail");
359 unexpected(!(hundred >= zeroSt),
"STAmount fail");
360 unexpected(!(hundred >= one),
"STAmount fail");
361 unexpected(!(hundred >= hundred),
"STAmount fail");
362 unexpected(!(zeroSt == zeroSt),
"STAmount fail");
364 unexpected((zeroSt == hundred),
"STAmount fail");
367 unexpected((one == hundred),
"STAmount fail");
368 unexpected((hundred == zeroSt),
"STAmount fail");
369 unexpected((hundred == one),
"STAmount fail");
370 unexpected(!(hundred == hundred),
"STAmount fail");
371 unexpected((zeroSt != zeroSt),
"STAmount fail");
372 unexpected(!(zeroSt != one),
"STAmount fail");
373 unexpected(!(zeroSt != hundred),
"STAmount fail");
374 unexpected(!(one != zeroSt),
"STAmount fail");
376 unexpected(!(one != hundred),
"STAmount fail");
377 unexpected(!(hundred != zeroSt),
"STAmount fail");
378 unexpected(!(hundred != one),
"STAmount fail");
379 unexpected((hundred != hundred),
"STAmount fail");
387 "STAmount multiply fail 1");
390 "STAmount multiply fail 2");
393 "STAmount multiply fail 3");
396 "STAmount multiply fail 4");
401 fail(
"STAmount divide fail");
410 "STAmount divide fail");
414 "STAmount divide fail");
418 "STAmount divide fail");
425 "STAmount setRate(getRate) fail");
429 "STAmount setRate(getRate) fail");
445 (((100ull - 14) << (64 - 8)) | 1000000000000000ull),
446 "STAmount getRate fail 1");
450 (((100ull - 16) << (64 - 8)) | 1000000000000000ull),
451 "STAmount getRate fail 2");
455 (((100ull - 14) << (64 - 8)) | 1000000000000000ull),
456 "STAmount getRate fail 3");
460 (((100ull - 16) << (64 - 8)) | 1000000000000000ull),
461 "STAmount getRate fail 4");
465 (((100ull - 14) << (64 - 8)) | 1000000000000000ull),
466 "STAmount getRate fail 5");
470 (((100ull - 16) << (64 - 8)) | 1000000000000000ull),
471 "STAmount getRate fail 6");
475 (((100ull - 14) << (64 - 8)) | 1000000000000000ull),
476 "STAmount getRate fail 7");
480 (((100ull - 16) << (64 - 8)) | 1000000000000000ull),
481 "STAmount getRate fail 8");
490 for (
int i = 0; i <= 100000; ++i)
531 BEAST_EXPECT(r == 0);
534 r =
getRate(bigValue, smallValue);
536 BEAST_EXPECT(r == 0);
555 BEAST_EXPECT(stnum.
getSType() == STI_AMOUNT);
556 BEAST_EXPECT(stnum.
getText() ==
"0");
598 std::string const expected =
"XRP and MPT must be specified as integral amount.";
599 BEAST_EXPECT(e.
what() == expected);
610 std::string const expected =
"XRP and MPT must be specified as integral amount.";
611 BEAST_EXPECT(e.
what() == expected);
623 BEAST_EXPECT(e.
what() == expected);
633 std::string const expected =
"'e' is not a number";
634 BEAST_EXPECT(e.
what() == expected);
644 std::string const expected =
"'1e' is not a number";
645 BEAST_EXPECT(e.
what() == expected);
655 std::string const expected =
"'e2' is not a number";
656 BEAST_EXPECT(e.
what() == expected);
666 std::string const expected =
"XRP may not be specified with a null Json value";
667 BEAST_EXPECT(e.
what() == expected);
674 "123456789012345678901234567890123456789012345678901234"
676 "901234567890123456789012345678901234567890123456789012"
678 "78901234567890123456789012345678901234567890");
694 std::string const expected =
"'001' is not a number";
695 BEAST_EXPECT(e.
what() == expected);
705 std::string const expected =
"'000.0' is not a number";
706 BEAST_EXPECT(e.
what() == expected);
717 std::string const expected =
"'.1' is not a number";
718 BEAST_EXPECT(e.
what() == expected);
728 std::string const expected =
"'1.' is not a number";
729 BEAST_EXPECT(e.
what() == expected);
739 std::string const expected =
"'1.e3' is not a number";
740 BEAST_EXPECT(e.
what() == expected);
748 testcase(
"STAmount to XRPAmount conversions");
753 for (
std::uint64_t drops = 100000000000000000; drops != 1; drops = drops / 10)
756 auto const s = t.xrp();
757 BEAST_EXPECT(s.drops() == drops);
773 fail(
"wrong exception");
780 testcase(
"STAmount to IOUAmount conversions");
785 for (
std::uint64_t dollars = 10000000000; dollars != 1; dollars = dollars / 10)
788 auto const s = t.iou();
789 BEAST_EXPECT(t ==
STAmount(s, usd));
790 BEAST_EXPECT(s.mantissa() == t.mantissa());
791 BEAST_EXPECT(s.exponent() == t.exponent());
805 fail(
"wrong exception");
818 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
825 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
832 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
839 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
846 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
853 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
861 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
877 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
884 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
891 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
898 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
905 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
912 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
919 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
935 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
942 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
949 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
956 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
963 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
970 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
981 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
988 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
995 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
1002 testcase(
"MPT transfer rate rounding uses Number arithmetic");
1006 STAmount const largeAmount{asset, UINT64_C(1'230'000'000'000'000'000)};
1007 STAmount const scaledAmount{asset, UINT64_C(1'845'000'000'000'000'000)};
1009 auto rules = [](
bool const mptV2) {
1015 return Rules{mptV2 ? kMptV2Features : kNoFeatures};
1018 auto throwsOverflow = [&](
auto&& f,
bool expected =
true) {
1028 BEAST_EXPECT(threw == expected);
1070 auto const up =
mulRound(iouVal, xrpVal, usd,
true);
1071 auto const down =
mulRound(iouVal, xrpVal, usd,
false);
1072 BEAST_EXPECT(down.signum() > 0);
1073 BEAST_EXPECT(up >= down);
1256 int const refScale = ref.exponent();
1257 BEAST_EXPECT(refScale == -14);
1275 BEAST_EXPECT(!ref.isZeroAtScale(refScale));
bool unexpected(Condition shouldBeFalse, String const &reason)
DEPRECATED.
void pass()
Record a successful test condition.
void fail(String const &reason, char const *file, int line)
Record a failure.
LogOs< char > log
Logging output stream.
TestcaseT testcase
Memberspace for declaring test cases.
RAII class to set and restore the current transaction rules.
A currency issued by an account.
Number is a floating point type that can represent a wide range of values.
Rules controlling protocol behavior.
static STAmount roundSelf(STAmount const &amount)
void testSetValue(std::string const &value, Issue const &issue, bool success=true)
void testCanSubtractXRP()
void run() override
Runs the suite.
void testMPTRateRounding()
void testCanSubtractMPT()
void mulTest(int a, int b)
void testCanSubtractIOU()
static STAmount serializeAndDeserialize(STAmount const &s)
void testNativeCurrency()
void roundTest(int n, int d, int m)
void testCustomCurrency()
constexpr TIss const & get() const
std::string getFullText() const override
void add(Serializer &s) const override
std::uint64_t mantissa() const noexcept
std::string getText() const override
static constexpr int kMinOffset
SerializedTypeID getSType() const override
bool negative() const noexcept
bool isDefault() const override
bool native() const noexcept
Asset const & asset() const
int exponent() const noexcept
bool isZeroAtScale(int scale) const
Checks if this amount evaluates to zero when constrained to a specific accounting scale.
static constexpr std::uint64_t kMinValue
static constexpr std::uint64_t kMaxValue
static constexpr std::uint64_t kMaxNative
static constexpr int kMaxOffset
STAmount const & value() const noexcept
Slice slice() const noexcept
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
STAmount divide(STAmount const &amount, Rate const &rate)
Issue const & xrpIssue()
Returns an asset specifier that represents XRP.
BaseUInt< 160, detail::CurrencyTag > Currency
Currency is a hash representing a specific currency.
STAmount amountFromString(Asset const &asset, std::string const &amount)
bool toCurrency(Currency &, std::string const &)
Tries to convert a string to a Currency, returns true on success.
std::string to_string(BaseUInt< Bits, Tag > const &a)
bool canAdd(STAmount const &amt1, STAmount const &amt2)
Safely checks if two STAmount values can be added without overflow, underflow, or precision loss.
STAmount amountFromQuality(std::uint64_t rate)
Rate transferRate(ReadView const &view, AccountID const &issuer)
Returns IOU issuer transfer fee as Rate.
STAmount multiplyRound(STAmount const &amount, Rate const &rate, bool roundUp)
std::uint64_t getRate(STAmount const &offerOut, STAmount const &offerIn)
STAmount amountFromJson(SField const &name, json::Value const &v)
MPTID makeMptID(std::uint32_t const sequence, AccountID const &account)
BaseUInt< 160, detail::AccountIDTag > AccountID
A 160-bit unsigned that uniquely identifies an account.
STAmount mulRound(STAmount const &v1, STAmount const &v2, Asset const &asset, bool roundUp)
bool canSubtract(STAmount const &amt1, STAmount const &amt2)
Determines if it is safe to subtract one STAmount from another.
Issue const & noIssue()
Returns an asset specifier that represents no account and currency.
STAmount multiply(STAmount const &amount, Number const &frac, Number::RoundingMode rm)
STAmount divideRound(STAmount const &amount, Rate const &rate, bool roundUp)
BEAST_DEFINE_TESTSUITE(AccountTxPaging, app, xrpl)
Represents a transfer rate.