diff --git a/src/libxrpl/protocol/STNumber.cpp b/src/libxrpl/protocol/STNumber.cpp index b02936709f..3419d5ba4b 100644 --- a/src/libxrpl/protocol/STNumber.cpp +++ b/src/libxrpl/protocol/STNumber.cpp @@ -65,6 +65,8 @@ STNumber::add(Serializer& s) const { constexpr std::int64_t min = 100'000'000'000'000'000LL; constexpr std::int64_t max = min * 10 - 1; + static_assert( + min < (std::numeric_limits::max() - 1 / 10)); auto const [mantissa, exponent] = value_.normalizeToRange(min, max); s.add64(mantissa); s.add32(exponent); @@ -197,16 +199,18 @@ numberFromJson(SField const& field, Json::Value const& value) else if (value.isString()) { parts = partsFromString(value.asString()); - // Only strings can represent out-of-range values. - if (parts.mantissa > std::numeric_limits::max()) - Throw("too high"); + // Number mantissas are much bigger than the allowable parsed values, so + // it can't be out of range. + static_assert( + std::numeric_limits::max() > + std::numeric_limits::max()); } else { Throw("not a number"); } - std::int64_t mantissa = parts.mantissa; + numberint128 mantissa = parts.mantissa; if (parts.negative) mantissa = -mantissa; diff --git a/src/test/protocol/STNumber_test.cpp b/src/test/protocol/STNumber_test.cpp index 638013832e..3a2092d291 100644 --- a/src/test/protocol/STNumber_test.cpp +++ b/src/test/protocol/STNumber_test.cpp @@ -148,12 +148,10 @@ struct STNumber_test : public beast::unit_test::suite numberFromJson(sfNumber, maxInt) == STNumber( sfNumber, Number{9'223'372'036'854'775'807, 0})); - /* BEAST_EXPECT( numberFromJson(sfNumber, minInt) == STNumber( - sfNumber, Number{-9'223'372'036'854'775'807, 0})); - */ + sfNumber, -Number{9'223'372'036'854'775'808, 0})); } }