diff --git a/changelog.d/20231103_115610_chanhosuh_fix_calc_diff.rst b/changelog.d/20231103_115610_chanhosuh_fix_calc_diff.rst new file mode 100644 index 000000000..a00d141a7 --- /dev/null +++ b/changelog.d/20231103_115610_chanhosuh_fix_calc_diff.rst @@ -0,0 +1,4 @@ +Fixed +----- + +- Fixed handling of integer signed division in Tricrypto-NG's `get_y` calc. diff --git a/curvesim/pool/cryptoswap/calcs/tricrypto_ng.py b/curvesim/pool/cryptoswap/calcs/tricrypto_ng.py index df6002eb7..de775e164 100644 --- a/curvesim/pool/cryptoswap/calcs/tricrypto_ng.py +++ b/curvesim/pool/cryptoswap/calcs/tricrypto_ng.py @@ -101,6 +101,7 @@ def get_y( # noqa: complexity: 18 else: _c = gamma2 * _c_neg // D * ANN // 27 // A_MULTIPLIER c += _c + c_is_neg = c < 0 # (10**18 + gamma)**2/27 d: int = (10**18 + gamma) ** 2 // 27 @@ -131,6 +132,8 @@ def get_y( # noqa: complexity: 18 additional_prec: int = 0 if b_is_neg: b *= -1 + if c_is_neg: + c *= -1 if abs(a) > abs(b): additional_prec = abs(a // b) a = a * additional_prec // divider @@ -145,19 +148,25 @@ def get_y( # noqa: complexity: 18 d = d // additional_prec // divider if b_is_neg: b *= -1 + if c_is_neg: + c *= -1 # 3*a*c/b - b - _3ac: int = 3 * a * c - if b_is_neg: + _3ac: int = (3 * a) * c + if sign(_3ac) != sign(b): delta0: int = -(_3ac // -b) - b else: delta0 = _3ac // b - b # 9*a*c/b - 2*b - 27*a**2/b*d/b + if sign(_3ac) != sign(b): + delta1: int = -(3 * _3ac // -b) - 2 * b + else: + delta1 = 3 * _3ac // b - 2 * b if b_is_neg: - delta1: int = -(3 * _3ac // -b) - 2 * b - 27 * a**2 // -b * d // -b + delta1 -= 27 * a**2 // -b * d // -b else: - delta1 = 3 * _3ac // b - 2 * b - 27 * a**2 // b * d // b + delta1 -= 27 * a**2 // b * d // b # delta1**2 + 4*delta0**2/b*delta0 if b_is_neg: diff --git a/test/unit/test_tricrypto.py b/test/unit/test_tricrypto.py index c49cb1180..9a94563bd 100644 --- a/test/unit/test_tricrypto.py +++ b/test/unit/test_tricrypto.py @@ -20,6 +20,7 @@ _newton_y, wad_exp, ) + from ..fixtures.pool import pack_prices, unpack_prices @@ -305,7 +306,7 @@ def test_get_p(tricrypto_math, A, gamma, x0, x1, x2): st.integers(min_value=0, max_value=2), st.integers(min_value=0, max_value=2), ).filter(lambda x: x[0] != x[1]), - st.integers(min_value=1, max_value=10000), + st.integers(min_value=1, max_value=5500), ) @settings( suppress_health_check=[HealthCheck.function_scoped_fixture],