From cb3d418f3b7de90b6c3d731e1b6a568905f6d956 Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Sat, 30 Aug 2025 15:55:33 +0400 Subject: [PATCH 1/3] test zero constant --- .gas-snapshot | 63 ++++++++++--------- src/concrete/DecimalFloat.sol | 6 ++ .../src/concrete/DecimalFloat.constants.t.sol | 17 +++++ test/src/lib/LibDecimalFloat.constants.t.sol | 6 +- 4 files changed, 60 insertions(+), 32 deletions(-) diff --git a/.gas-snapshot b/.gas-snapshot index 9350e800..ac80e98e 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -1,35 +1,36 @@ -DecimalFloatAbsTest:testAbsDeployed(bytes32) (runs: 5098, μ: 2654875, ~: 2654817) -DecimalFloatAddTest:testAddDeployed(bytes32,bytes32) (runs: 5098, μ: 2658941, ~: 2659013) -DecimalFloatCeilTest:testCeilDeployed(bytes32) (runs: 5098, μ: 2654903, ~: 2654530) -DecimalFloatConstantsTest:testEDeployed() (gas: 2654060) -DecimalFloatConstantsTest:testMaxNegativeValueDeployed() (gas: 2654092) -DecimalFloatConstantsTest:testMaxPositiveValueDeployed() (gas: 2654050) -DecimalFloatConstantsTest:testMinNegativeValueDeployed() (gas: 2654025) -DecimalFloatConstantsTest:testMinPositiveValueDeployed() (gas: 2654004) -DecimalFloatDivTest:testDivDeployed(bytes32,bytes32) (runs: 5098, μ: 2660874, ~: 2660957) -DecimalFloatEqTest:testEqDeployed(bytes32,bytes32) (runs: 5098, μ: 2655259, ~: 2655185) -DecimalFloatFloorTest:testFloorDeployed(bytes32) (runs: 5098, μ: 2654712, ~: 2654528) -DecimalFloatFormatTest:testFormatDeployed(bytes32) (runs: 5098, μ: 2658855, ~: 2658721) -DecimalFloatFracTest:testFracDeployed(bytes32) (runs: 5098, μ: 2655104, ~: 2655088) -DecimalFloatFromFixedDecimalLosslessTest:testFromFixedDecimalLosslessDeployed(uint256,uint8) (runs: 5098, μ: 2655656, ~: 2655592) -DecimalFloatFromFixedDecimalLossyTest:testFromFixedDecimalLossyDeployed(uint256,uint8) (runs: 5098, μ: 2656145, ~: 2656062) -DecimalFloatGtTest:testGtDeployed(bytes32,bytes32) (runs: 5098, μ: 2655202, ~: 2655127) -DecimalFloatGteTest:testGteDeployed(bytes32,bytes32) (runs: 5098, μ: 2655188, ~: 2655113) -DecimalFloatInvTest:testInvDeployed(bytes32) (runs: 5098, μ: 2659738, ~: 2659772) -DecimalFloatIsZeroTest:testIsZeroDeployed(bytes32) (runs: 5098, μ: 2654370, ~: 2654370) -DecimalFloatLtTest:testLtDeployed(bytes32,bytes32) (runs: 5098, μ: 2655179, ~: 2655104) -DecimalFloatLteTest:testLteDeployed(bytes32,bytes32) (runs: 5098, μ: 2655232, ~: 2655157) -DecimalFloatMaxTest:testMaxDeployed(bytes32,bytes32) (runs: 5098, μ: 2655240, ~: 2655179) -DecimalFloatMinTest:testMinDeployed(bytes32,bytes32) (runs: 5098, μ: 2655260, ~: 2655199) -DecimalFloatMinusTest:testMinusDeployed(bytes32) (runs: 5098, μ: 2654975, ~: 2654975) -DecimalFloatMulTest:testMulDeployed(bytes32,bytes32) (runs: 5098, μ: 2658831, ~: 2659644) +DecimalFloatAbsTest:testAbsDeployed(bytes32) (runs: 5098, μ: 2661669, ~: 2661611) +DecimalFloatAddTest:testAddDeployed(bytes32,bytes32) (runs: 5098, μ: 2665752, ~: 2665829) +DecimalFloatCeilTest:testCeilDeployed(bytes32) (runs: 5098, μ: 2661695, ~: 2661324) +DecimalFloatConstantsTest:testEDeployed() (gas: 2660876) +DecimalFloatConstantsTest:testMaxNegativeValueDeployed() (gas: 2660843) +DecimalFloatConstantsTest:testMaxPositiveValueDeployed() (gas: 2660866) +DecimalFloatConstantsTest:testMinNegativeValueDeployed() (gas: 2660841) +DecimalFloatConstantsTest:testMinPositiveValueDeployed() (gas: 2660842) +DecimalFloatConstantsTest:testZeroDeployed() (gas: 2660909) +DecimalFloatDivTest:testDivDeployed(bytes32,bytes32) (runs: 5098, μ: 2667703, ~: 2667779) +DecimalFloatEqTest:testEqDeployed(bytes32,bytes32) (runs: 5098, μ: 2662076, ~: 2662001) +DecimalFloatFloorTest:testFloorDeployed(bytes32) (runs: 5098, μ: 2661551, ~: 2661367) +DecimalFloatFormatTest:testFormatDeployed(bytes32) (runs: 5098, μ: 2665643, ~: 2665501) +DecimalFloatFracTest:testFracDeployed(bytes32) (runs: 5098, μ: 2661920, ~: 2661904) +DecimalFloatFromFixedDecimalLosslessTest:testFromFixedDecimalLosslessDeployed(uint256,uint8) (runs: 5098, μ: 2662474, ~: 2662408) +DecimalFloatFromFixedDecimalLossyTest:testFromFixedDecimalLossyDeployed(uint256,uint8) (runs: 5098, μ: 2662958, ~: 2662878) +DecimalFloatGtTest:testGtDeployed(bytes32,bytes32) (runs: 5098, μ: 2661995, ~: 2661921) +DecimalFloatGteTest:testGteDeployed(bytes32,bytes32) (runs: 5098, μ: 2662068, ~: 2661994) +DecimalFloatInvTest:testInvDeployed(bytes32) (runs: 5098, μ: 2666551, ~: 2666588) +DecimalFloatIsZeroTest:testIsZeroDeployed(bytes32) (runs: 5098, μ: 2661186, ~: 2661186) +DecimalFloatLtTest:testLtDeployed(bytes32,bytes32) (runs: 5098, μ: 2661994, ~: 2661920) +DecimalFloatLteTest:testLteDeployed(bytes32,bytes32) (runs: 5098, μ: 2662026, ~: 2661951) +DecimalFloatMaxTest:testMaxDeployed(bytes32,bytes32) (runs: 5098, μ: 2662057, ~: 2661995) +DecimalFloatMinTest:testMinDeployed(bytes32,bytes32) (runs: 5098, μ: 2662055, ~: 2661993) +DecimalFloatMinusTest:testMinusDeployed(bytes32) (runs: 5098, μ: 2661791, ~: 2661791) +DecimalFloatMulTest:testMulDeployed(bytes32,bytes32) (runs: 5098, μ: 2665714, ~: 2666527) DecimalFloatPackLosslessTest:testPackDeployed(int224,int32) (runs: 5098, μ: 158769, ~: 158769) -DecimalFloatParseTest:testParseDeployed(string) (runs: 5098, μ: 2657608, ~: 2657477) -DecimalFloatPowTest:testPowDeployed(bytes32,bytes32) (runs: 5098, μ: 2666894, ~: 2665819) -DecimalFloatSqrtTest:testSqrtDeployed(bytes32) (runs: 5098, μ: 2666573, ~: 2666521) -DecimalFloatSubTest:testSubDeployed(bytes32,bytes32) (runs: 5098, μ: 2659288, ~: 2659313) -DecimalFloatToFixedDecimalLosslessTest:testToFixedDecimalLosslessDeployed(bytes32,uint8) (runs: 5098, μ: 2656303, ~: 2656175) -DecimalFloatToFixedDecimalLossyTest:testToFixedDecimalLossyDeployed(bytes32,uint8) (runs: 5098, μ: 2656436, ~: 2656704) +DecimalFloatParseTest:testParseDeployed(string) (runs: 5098, μ: 2664423, ~: 2664292) +DecimalFloatPowTest:testPowDeployed(bytes32,bytes32) (runs: 5098, μ: 2673719, ~: 2672635) +DecimalFloatSqrtTest:testSqrtDeployed(bytes32) (runs: 5098, μ: 2673426, ~: 2673337) +DecimalFloatSubTest:testSubDeployed(bytes32,bytes32) (runs: 5098, μ: 2666110, ~: 2666129) +DecimalFloatToFixedDecimalLosslessTest:testToFixedDecimalLosslessDeployed(bytes32,uint8) (runs: 5098, μ: 2663137, ~: 2663014) +DecimalFloatToFixedDecimalLossyTest:testToFixedDecimalLossyDeployed(bytes32,uint8) (runs: 5098, μ: 2663251, ~: 2663520) LibDecimalFloatAbsTest:testAbsMinValue(int32) (runs: 5098, μ: 5121, ~: 5121) LibDecimalFloatAbsTest:testAbsNegative(int256,int32) (runs: 5098, μ: 10475, ~: 10702) LibDecimalFloatAbsTest:testAbsNonNegative(int256,int32) (runs: 5098, μ: 9641, ~: 9392) diff --git a/src/concrete/DecimalFloat.sol b/src/concrete/DecimalFloat.sol index e79f7dde..9633d67c 100644 --- a/src/concrete/DecimalFloat.sol +++ b/src/concrete/DecimalFloat.sol @@ -33,6 +33,12 @@ contract DecimalFloat { return LibDecimalFloat.FLOAT_MIN_NEGATIVE_VALUE; } + /// Exposes maximized zero for offchain use. + /// @return The maximized zero value of a Float. + function zero() external pure returns (Float) { + return LibDecimalFloat.FLOAT_ZERO; + } + /// Exposes `LibDecimalFloat.FLOAT_E` for offchain use. /// @return The constant value of Euler's number as a Float. function e() external pure returns (Float) { diff --git a/test/src/concrete/DecimalFloat.constants.t.sol b/test/src/concrete/DecimalFloat.constants.t.sol index 4c11a220..a2cee756 100644 --- a/test/src/concrete/DecimalFloat.constants.t.sol +++ b/test/src/concrete/DecimalFloat.constants.t.sol @@ -93,4 +93,21 @@ contract DecimalFloatConstantsTest is Test { deployed.e(); } } + + function zeroExternal() external pure returns (Float) { + return LibDecimalFloat.FLOAT_ZERO; + } + + function testZeroDeployed() external { + DecimalFloat deployed = new DecimalFloat(); + + try this.zeroExternal() returns (Float zeroValue) { + Float deployedZeroValue = deployed.zero(); + + assertEq(Float.unwrap(zeroValue), Float.unwrap(deployedZeroValue)); + } catch (bytes memory err) { + vm.expectRevert(err); + deployed.zero(); + } + } } diff --git a/test/src/lib/LibDecimalFloat.constants.t.sol b/test/src/lib/LibDecimalFloat.constants.t.sol index da43db28..916ff8ee 100644 --- a/test/src/lib/LibDecimalFloat.constants.t.sol +++ b/test/src/lib/LibDecimalFloat.constants.t.sol @@ -3,6 +3,10 @@ pragma solidity =0.8.25; import {LibDecimalFloat, Float} from "src/lib/LibDecimalFloat.sol"; +import { + MAXIMIZED_ZERO_SIGNED_COEFFICIENT, + MAXIMIZED_ZERO_EXPONENT +} from "src/lib/implementation/LibDecimalFloatImplementation.sol"; import {Test} from "forge-std/Test.sol"; contract LibDecimalFloatConstantsTest is Test { @@ -68,7 +72,7 @@ contract LibDecimalFloatConstantsTest is Test { function testFloatZero() external pure { Float zero = LibDecimalFloat.FLOAT_ZERO; - Float expected = LibDecimalFloat.packLossless(0, 0); + Float expected = LibDecimalFloat.packLossless(MAXIMIZED_ZERO_SIGNED_COEFFICIENT, MAXIMIZED_ZERO_EXPONENT); assertEq(Float.unwrap(zero), Float.unwrap(expected)); } From 23bb7db988b2e6fd18c54399c5f7f9c112dd4ebe Mon Sep 17 00:00:00 2001 From: David Meister Date: Mon, 1 Sep 2025 14:02:54 +0400 Subject: [PATCH 2/3] Update src/concrete/DecimalFloat.sol Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- src/concrete/DecimalFloat.sol | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/concrete/DecimalFloat.sol b/src/concrete/DecimalFloat.sol index 9633d67c..bebff358 100644 --- a/src/concrete/DecimalFloat.sol +++ b/src/concrete/DecimalFloat.sol @@ -33,12 +33,11 @@ contract DecimalFloat { return LibDecimalFloat.FLOAT_MIN_NEGATIVE_VALUE; } - /// Exposes maximized zero for offchain use. - /// @return The maximized zero value of a Float. + /// Exposes `LibDecimalFloat.FLOAT_ZERO` for offchain use. + /// @return The zero value of a Float in its maximized representation. function zero() external pure returns (Float) { return LibDecimalFloat.FLOAT_ZERO; } - /// Exposes `LibDecimalFloat.FLOAT_E` for offchain use. /// @return The constant value of Euler's number as a Float. function e() external pure returns (Float) { From 4a2c21a40de2b1ba8fa2f6400e6fef4516ec7124 Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Mon, 1 Sep 2025 14:24:46 +0400 Subject: [PATCH 3/3] fmt --- src/concrete/DecimalFloat.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/src/concrete/DecimalFloat.sol b/src/concrete/DecimalFloat.sol index bebff358..0bb025ef 100644 --- a/src/concrete/DecimalFloat.sol +++ b/src/concrete/DecimalFloat.sol @@ -40,6 +40,7 @@ contract DecimalFloat { } /// Exposes `LibDecimalFloat.FLOAT_E` for offchain use. /// @return The constant value of Euler's number as a Float. + function e() external pure returns (Float) { return LibDecimalFloat.FLOAT_E; }