From e10c3c7093bb7cef0bbdf1c0da60e744bec1e8cd Mon Sep 17 00:00:00 2001 From: 7400 <7400> Date: Wed, 1 Nov 2023 15:00:38 -0700 Subject: [PATCH] Test uniswap issue 586 --- test/TestFullMath.py | 12 ++++++++++++ test/TestFullMath.sol | 22 ++++++++++++++++------ 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/test/TestFullMath.py b/test/TestFullMath.py index cdf0882..d1cc73b 100644 --- a/test/TestFullMath.py +++ b/test/TestFullMath.py @@ -7,4 +7,16 @@ MAXneg = -MAXpos-1 print("MAXpos:", hex(MAXpos)) print("MAXneg:", hex(MAXneg)) +# https://github.com/Uniswap/v3-core/issues/586 + +a = 316922101631557355182318461781248010879680643072; # ~2^157 +b = 2694519998095207227803175883740; # ~2^101 +d = 79232019085396855395509160680691688; # ~2^116 +expected = 10777876804631170754249523106393912452806121; # ~2^143 + +r = a * b // d +print("Expected issue 586", expected) + +assert r == expected + pass \ No newline at end of file diff --git a/test/TestFullMath.sol b/test/TestFullMath.sol index ec39093..0781b56 100644 --- a/test/TestFullMath.sol +++ b/test/TestFullMath.sol @@ -63,15 +63,25 @@ contract TestFullMath is Test { q = FullMath.mulDiv(MAXneg, MinusOne, MinusOne); require(q == MAXneg, "case 4f failed"); + // Case 5 + // https://github.com/Uniswap/v3-core/issues/586 + + uint256 a; + uint256 b; + uint256 d; + uint256 expected; + + a = 316922101631557355182318461781248010879680643072; // ~2^157 + b = 2694519998095207227803175883740; // ~2^101 + d = 79232019085396855395509160680691688; // ~2^116 + expected = 10777876804631170754249523106393912452806121; // ~2^143 + require (FullMath.mulDiv(a, b, d) == expected, "Case 5 failed"); + // Case 10 -- various exponents uint256 aExp; uint256 bExp; uint256 dExp; - uint256 a; - uint256 b; - uint256 d; - uint256 qExpected; aExp = 255; bExp = 255; @@ -80,10 +90,10 @@ contract TestFullMath is Test { a = 2**aExp; b = 2**bExp; d = 2**dExp; - qExpected = 2**(aExp+bExp-dExp); + expected = 2**(aExp+bExp-dExp); q = FullMath.mulDiv(a,b,d); // DUT - require(q == qExpected, "case 10 failed"); // check + require(q == expected, "case 10 failed"); // check } }