diff --git a/tests/fixtures/factory.py b/tests/fixtures/factory.py index cec26d32..64cca17a 100644 --- a/tests/fixtures/factory.py +++ b/tests/fixtures/factory.py @@ -5,7 +5,7 @@ @pytest.fixture(scope="module") def math_contract(deployer): with boa.env.prank(deployer): - return boa.load("contracts/main/CurveCryptoMathOptimized2.vy") + return boa.load("contracts/main/TwocryptoMath.vy") @pytest.fixture(scope="module") @@ -21,7 +21,7 @@ def gauge_implementation(deployer, gauge_interface): @pytest.fixture(scope="module") def amm_interface(): - return boa.load_partial("contracts/main/CurveTwocryptoOptimized.vy") + return boa.load_partial("contracts/main/Twocrypto.vy") @pytest.fixture(scope="module") @@ -33,7 +33,7 @@ def amm_implementation(deployer, amm_interface): @pytest.fixture(scope="module") def views_contract(deployer): with boa.env.prank(deployer): - return boa.load("contracts/main/CurveCryptoViews2Optimized.vy") + return boa.load("contracts/main/TwocryptoView.vy") @pytest.fixture(scope="module") @@ -47,7 +47,7 @@ def factory( views_contract, ): with boa.env.prank(deployer): - factory = boa.load("contracts/main/CurveTwocryptoFactory.vy") + factory = boa.load("contracts/main/TwocryptoFactory.vy") factory.initialise_ownership(fee_receiver, owner) with boa.env.prank(owner): diff --git a/tests/unitary/factory/test_deploy_pool.py b/tests/unitary/factory/test_deploy_pool.py index 6bec5c04..56f889f9 100644 --- a/tests/unitary/factory/test_deploy_pool.py +++ b/tests/unitary/factory/test_deploy_pool.py @@ -8,7 +8,7 @@ def empty_factory(deployer, fee_receiver, owner): with boa.env.prank(deployer): factory = boa.load( - "contracts/main/CurveTwocryptoFactory.vy", + "contracts/main/TwocryptoFactory.vy", ) assert factory.admin() == ZERO_ADDRESS @@ -31,7 +31,7 @@ def test_deployer_cannot_set_ownership_twice(empty_factory, deployer): def test_nondeployer_cannot_set_ownership(deployer): with boa.env.prank(deployer): factory = boa.load( - "contracts/main/CurveTwocryptoFactory.vy", + "contracts/main/TwocryptoFactory.vy", ) with boa.env.prank(boa.env.generate_address()), boa.reverts(): diff --git a/tests/unitary/math/conftest.py b/tests/unitary/math/conftest.py index 64bcd4b4..2d9981b7 100644 --- a/tests/unitary/math/conftest.py +++ b/tests/unitary/math/conftest.py @@ -5,7 +5,7 @@ @pytest.fixture(scope="module") def math_optimized(deployer): with boa.env.prank(deployer): - return boa.load("contracts/main/CurveCryptoMathOptimized2.vy") + return boa.load("contracts/main/TwocryptoMath.vy") @pytest.fixture(scope="module") diff --git a/tests/unitary/math/contracts/newton_y_exposed.vy b/tests/unitary/math/contracts/newton_y_exposed.vy index 1dcf36d7..bc754a31 100644 --- a/tests/unitary/math/contracts/newton_y_exposed.vy +++ b/tests/unitary/math/contracts/newton_y_exposed.vy @@ -1,3 +1,4 @@ +# pragma version ~=0.4.0 # Minimized version of the math contracts that expose some inner details of newton_y for testing purposes: # - Additionally to the final value it also returns the number of iterations it took to find the value. # From commit: 6dec22f6956cc04fb865d93c1e521f146e066cab @@ -8,7 +9,7 @@ A_MULTIPLIER: constant(uint256) = 10000 MIN_GAMMA: constant(uint256) = 10**10 MAX_GAMMA: constant(uint256) = 3 * 10**17 -MIN_A: constant(uint256) = N_COINS**N_COINS * A_MULTIPLIER / 10 +MIN_A: constant(uint256) = N_COINS**N_COINS * A_MULTIPLIER // 10 MAX_A: constant(uint256) = N_COINS**N_COINS * A_MULTIPLIER * 1000 @internal @@ -21,17 +22,17 @@ def _newton_y(ANN: uint256, gamma: uint256, x: uint256[N_COINS], D: uint256, i: """ x_j: uint256 = x[1 - i] - y: uint256 = D**2 / (x_j * N_COINS**2) - K0_i: uint256 = (10**18 * N_COINS) * x_j / D + y: uint256 = D**2 // (x_j * N_COINS**2) + K0_i: uint256 = (10**18 * N_COINS) * x_j // D assert (K0_i >= unsafe_div(10**36, lim_mul)) and (K0_i <= lim_mul) # dev: unsafe values x[i] - convergence_limit: uint256 = max(max(x_j / 10**14, D / 10**14), 100) + convergence_limit: uint256 = max(max(x_j // 10**14, D // 10**14), 100) - for j in range(255): + for j: uint256 in range(255): y_prev: uint256 = y - K0: uint256 = K0_i * y * N_COINS / D + K0: uint256 = K0_i * y * N_COINS // D S: uint256 = x_j + y _g1k0: uint256 = gamma + 10**18 @@ -41,28 +42,28 @@ def _newton_y(ANN: uint256, gamma: uint256, x: uint256[N_COINS], D: uint256, i: _g1k0 = K0 - _g1k0 + 1 # D / (A * N**N) * _g1k0**2 / gamma**2 - mul1: uint256 = 10**18 * D / gamma * _g1k0 / gamma * _g1k0 * A_MULTIPLIER / ANN + mul1: uint256 = 10**18 * D // gamma * _g1k0 // gamma * _g1k0 * A_MULTIPLIER // ANN # 2*K0 / _g1k0 - mul2: uint256 = 10**18 + (2 * 10**18) * K0 / _g1k0 + mul2: uint256 = 10**18 + (2 * 10**18) * K0 // _g1k0 yfprime: uint256 = 10**18 * y + S * mul2 + mul1 _dyfprime: uint256 = D * mul2 if yfprime < _dyfprime: - y = y_prev / 2 + y = y_prev // 2 continue else: yfprime -= _dyfprime - fprime: uint256 = yfprime / y + fprime: uint256 = yfprime // y - # y -= f / f_prime; y = (y * fprime - f) / fprime + # y -= f // f_prime; y = (y * fprime - f) // fprime # y = (yfprime + 10**18 * D - 10**18 * S) // fprime + mul1 // fprime * (10**18 - K0) // K0 - y_minus: uint256 = mul1 / fprime - y_plus: uint256 = (yfprime + 10**18 * D) / fprime + y_minus * 10**18 / K0 - y_minus += 10**18 * S / fprime + y_minus: uint256 = mul1 // fprime + y_plus: uint256 = (yfprime + 10**18 * D) // fprime + y_minus * 10**18 // K0 + y_minus += 10**18 * S // fprime if y_plus < y_minus: - y = y_prev / 2 + y = y_prev // 2 else: y = y_plus - y_minus @@ -72,7 +73,7 @@ def _newton_y(ANN: uint256, gamma: uint256, x: uint256[N_COINS], D: uint256, i: else: diff = y_prev - y - if diff < max(convergence_limit, y / 10**14): + if diff < max(convergence_limit, y // 10**14): return y, j raise "Did not converge" diff --git a/tests/unitary/math/test_get_p.py b/tests/unitary/math/test_get_p.py index fd70f2d3..671d67b4 100644 --- a/tests/unitary/math/test_get_p.py +++ b/tests/unitary/math/test_get_p.py @@ -25,16 +25,16 @@ def get_p( assert _D > 10**17 - 1 and _D < 10**15 * 10**18 + 1 # dev: unsafe D values - K0: uint256 = 4 * _xp[0] * _xp[1] / _D * 10**36 / _D + K0: uint256 = 4 * _xp[0] * _xp[1] // _D * 10**36 // _D GK0: uint256 = ( - 2 * K0 * K0 / 10**36 * K0 / 10**36 + 2 * K0 * K0 // 10**36 * K0 // 10**36 + (_A_gamma[1] + 10**18)**2 - - K0**2 / 10**36 * (2 * _A_gamma[1] + 3 * 10**18) / 10**18 + - K0**2 // 10**36 * (2 * _A_gamma[1] + 3 * 10**18) // 10**18 ) - NNAG2: uint256 = _A_gamma[0] * _A_gamma[1]**2 / A_MULTIPLIER - denominator: uint256 = GK0 + NNAG2 * _xp[0] / _D * K0 / 10**36 - numerator: uint256 = _xp[0] * ( GK0 + NNAG2 * _xp[1] / _D * K0 / 10**36 ) / _xp[1] - return numerator * 10**18 / denominator + NNAG2: uint256 = _A_gamma[0] * _A_gamma[1]**2 // A_MULTIPLIER + denominator: uint256 = GK0 + NNAG2 * _xp[0] // _D * K0 // 10**36 + numerator: uint256 = _xp[0] * ( GK0 + NNAG2 * _xp[1] // _D * K0 // 10**36 ) // _xp[1] + return numerator * 10**18 // denominator """ return boa.loads(get_price_impl) diff --git a/tests/unitary/math/test_get_y.py b/tests/unitary/math/test_get_y.py index 88e9215d..9bf9cb66 100644 --- a/tests/unitary/math/test_get_y.py +++ b/tests/unitary/math/test_get_y.py @@ -80,7 +80,7 @@ def calculate_F_by_y0(y0): except Exception as e: event("hit unsafe for unoptimizied") if "unsafe value" in str(e): - assert "gamma" not in str(e) + assert "unsafe value for gamma" not in str(e) assert gamma > 2 * 10**16 return else: # Did not converge? diff --git a/tests/unitary/pool/admin/test_revert_commit_params.py b/tests/unitary/pool/admin/test_revert_commit_params.py index 093982f1..df5e6ab9 100644 --- a/tests/unitary/pool/admin/test_revert_commit_params.py +++ b/tests/unitary/pool/admin/test_revert_commit_params.py @@ -29,8 +29,8 @@ def test_commit_incorrect_fee_params(swap, factory_admin, params): p["mid_fee"] = params["mid_fee"] p["out_fee"] = 10**10 + 1 # <-- MAX_FEE _apply_new_params(swap, p) - logs = swap.get_logs()[0] - assert logs.args[1] == params["out_fee"] + log = swap.get_logs()[0] + assert log.out_fee == params["out_fee"] def test_commit_incorrect_fee_gamma(swap, factory_admin, params): @@ -45,7 +45,7 @@ def test_commit_incorrect_fee_gamma(swap, factory_admin, params): _apply_new_params(swap, p) # it will not change fee_gamma as it is above 10**18 - assert swap.get_logs()[0].args[2] == params["fee_gamma"] + assert swap.get_logs()[0].fee_gamma == params["fee_gamma"] def test_commit_rebalancing_params(swap, factory_admin, params): @@ -60,9 +60,9 @@ def test_commit_rebalancing_params(swap, factory_admin, params): logs = swap.get_logs()[0] # values revert to contract's storage values: - assert logs.args[3] == params["allowed_extra_profit"] - assert logs.args[4] == params["adjustment_step"] - assert logs.args[5] == params["ma_time"] + assert logs.allowed_extra_profit == params["allowed_extra_profit"] + assert logs.adjustment_step == params["adjustment_step"] + assert logs.ma_time == params["ma_time"] with boa.reverts("MA time should be longer than 60/ln(2)"): p["ma_time"] = 86 diff --git a/tests/unitary/pool/stateful/stateful_base.py b/tests/unitary/pool/stateful/stateful_base.py index 4ca31d5c..483856b1 100644 --- a/tests/unitary/pool/stateful/stateful_base.py +++ b/tests/unitary/pool/stateful/stateful_base.py @@ -12,7 +12,7 @@ ) from hypothesis.strategies import integers -from contracts.main import CurveTwocryptoFactory as factory +from contracts.main import TwocryptoFactory as factory from contracts.mocks import ERC20Mock as ERC20 from tests.utils.constants import UNIX_DAY from tests.utils.strategies import address, pool_from_preset diff --git a/tests/unitary/pool/test_deposit_withdraw.py b/tests/unitary/pool/test_deposit_withdraw.py index 93a5c05d..62706f3d 100644 --- a/tests/unitary/pool/test_deposit_withdraw.py +++ b/tests/unitary/pool/test_deposit_withdraw.py @@ -272,7 +272,7 @@ def test_immediate_withdraw_one( logs = swap_with_deposit.get_logs() for log in logs: - if log.event_type.name == "ClaimAdminFee": + if type(log).__name__ == "ClaimAdminFee": claimed_fees = log.args[0] except Exception: diff --git a/tests/unitary/pool/token/conftest.py b/tests/unitary/pool/token/conftest.py deleted file mode 100644 index 95ae53f2..00000000 --- a/tests/unitary/pool/token/conftest.py +++ /dev/null @@ -1,55 +0,0 @@ -from copy import deepcopy - -import boa -import pytest -from eth_account import Account as EthAccount -from eth_account._utils.structured_data.hashing import ( - hash_domain, - hash_message, -) -from eth_account.messages import SignableMessage -from hexbytes import HexBytes - - -@pytest.fixture(scope="module") -def sign_permit(): - def _sign_permit(swap, owner, spender, value, deadline): - PERMIT_STRUCT = { - "types": { - "EIP712Domain": [ - {"name": "name", "type": "string"}, - {"name": "version", "type": "string"}, - {"name": "chainId", "type": "uint256"}, - {"name": "verifyingContract", "type": "address"}, - {"name": "salt", "type": "bytes32"}, - ], - "Permit": [ - {"name": "owner", "type": "address"}, - {"name": "spender", "type": "address"}, - {"name": "value", "type": "uint256"}, - {"name": "nonce", "type": "uint256"}, - {"name": "deadline", "type": "uint256"}, - ], - }, - "primaryType": "Permit", - } - - struct = deepcopy(PERMIT_STRUCT) - struct["domain"] = dict( - name=swap.name(), - version=swap.version(), - chainId=boa.env.evm.patch.chain_id, - verifyingContract=swap.address, - salt=HexBytes(swap.salt()), - ) - struct["message"] = dict( - owner=owner.address, - spender=spender, - value=value, - nonce=swap.nonces(owner.address), - deadline=deadline, - ) - signable_message = SignableMessage(b"\x01", hash_domain(struct), hash_message(struct)) - return EthAccount.sign_message(signable_message, owner._private_key) - - return _sign_permit diff --git a/tests/unitary/pool/token/test_approve.py b/tests/unitary/pool/token/test_approve.py index 30dcadbe..3c481f56 100644 --- a/tests/unitary/pool/token/test_approve.py +++ b/tests/unitary/pool/token/test_approve.py @@ -59,10 +59,10 @@ def test_approval_event_fires(swap, alice, bob): logs = swap.get_logs() assert len(logs) == 1 - assert logs[0].event_type.name == "Approval" - assert logs[0].topics[0].lower() == alice.lower() - assert logs[0].topics[1].lower() == bob.lower() - assert logs[0].args[0] == 10**19 + assert type(logs[0]).__name__ == "Approval" + assert logs[0].owner.lower() == alice.lower() + assert logs[0].spender.lower() == bob.lower() + assert logs[0].value == 10**19 def test_infinite_approval(swap, alice, bob): diff --git a/tests/unitary/pool/token/test_permit.py b/tests/unitary/pool/token/test_permit.py deleted file mode 100644 index d2f9673d..00000000 --- a/tests/unitary/pool/token/test_permit.py +++ /dev/null @@ -1,90 +0,0 @@ -import boa -from hexbytes import HexBytes - -ZERO_ADDRESS = "0x0000000000000000000000000000000000000000" - - -# tests inspired by: -# https://github.com/yearn/yearn-vaults/blob/master/tests/functional/vault/test_permit.py # noqa: E501 -# https://github.com/curvefi/curve-stablecoin/blob/5b6708138d82419917328e8042f3857eac034796/tests/stablecoin/test_approve.py # noqa: E501 - - -def test_permit_success(eth_acc, bob, swap, sign_permit): - value = 2**256 - 1 - deadline = boa.env.evm.patch.timestamp + 600 - - sig = sign_permit( - swap=swap, - owner=eth_acc, - spender=bob, - value=value, - deadline=deadline, - ) - - assert swap.allowance(eth_acc.address, bob) == 0 - with boa.env.prank(bob): - assert swap.permit( - eth_acc.address, - bob, - value, - deadline, - sig.v, - HexBytes(sig.r), - HexBytes(sig.s), - ) - - logs = swap.get_logs() - - assert swap.allowance(eth_acc.address, bob) == value - assert len(logs) == 1 - assert swap.nonces(eth_acc.address) == 1 - assert logs[0].event_type.name == "Approval" - assert logs[0].topics[0].lower() == eth_acc.address.lower() - assert logs[0].topics[1].lower() == bob.lower() - assert logs[0].args[0] == value - - -def test_permit_reverts_owner_is_invalid(bob, swap): - with boa.reverts(dev="invalid owner"), boa.env.prank(bob): - swap.permit( - ZERO_ADDRESS, - bob, - 2**256 - 1, - boa.env.evm.patch.timestamp + 600, - 27, - b"\x00" * 32, - b"\x00" * 32, - ) - - -def test_permit_reverts_deadline_is_invalid(bob, swap): - with boa.reverts(dev="permit expired"), boa.env.prank(bob): - swap.permit( - bob, - bob, - 2**256 - 1, - boa.env.evm.patch.timestamp - 600, - 27, - b"\x00" * 32, - b"\x00" * 32, - ) - - -def test_permit_reverts_signature_is_invalid(bob, swap): - with boa.reverts(dev="invalid signature"), boa.env.prank(bob): - swap.permit( - bob, - bob, - 2**256 - 1, - boa.env.evm.patch.timestamp + 600, - 27, - b"\x00" * 32, - b"\x00" * 32, - ) - - -def test_domain_separator_updates_when_chain_id_updates(swap): - domain_separator = swap.DOMAIN_SEPARATOR() - with boa.env.anchor(): - boa.env.evm.patch.chain_id = 42 - assert domain_separator != swap.DOMAIN_SEPARATOR() diff --git a/tests/unitary/pool/token/test_transfer.py b/tests/unitary/pool/token/test_transfer.py index 4cbdb48f..323aec78 100644 --- a/tests/unitary/pool/token/test_transfer.py +++ b/tests/unitary/pool/token/test_transfer.py @@ -85,7 +85,8 @@ def test_transfer_event_fires(loaded_alice, bob, swap): logs = swap.get_logs() assert len(logs) == 1 - assert logs[0].event_type.name == "Transfer" - assert logs[0].args[0] == amount - assert logs[0].topics[0].lower() == loaded_alice.lower() - assert logs[0].topics[1].lower() == bob.lower() + assert type(logs[0]).__name__ == "Transfer" + print(logs[0]) + assert logs[0].value == amount + assert logs[0].sender.lower() == loaded_alice.lower() + assert logs[0].receiver.lower() == bob.lower() diff --git a/tests/unitary/pool/token/test_transferFrom.py b/tests/unitary/pool/token/test_transferFrom.py index 56f1f381..72d55bf6 100644 --- a/tests/unitary/pool/token/test_transferFrom.py +++ b/tests/unitary/pool/token/test_transferFrom.py @@ -197,12 +197,14 @@ def test_transfer_event_fires(loaded_alice, bob, charlie, swap): logs = swap.get_logs() assert len(logs) == 2 - assert logs[0].event_type.name == "Approval" - assert logs[0].args[0] == 0 # since everything got transferred - assert logs[0].topics[0].lower() == loaded_alice.lower() - assert logs[0].topics[1].lower() == bob.lower() - - assert logs[1].event_type.name == "Transfer" - assert logs[1].args[0] == amount - assert logs[1].topics[0].lower() == loaded_alice.lower() - assert logs[1].topics[1].lower() == charlie.lower() + assert type(logs[0]).__name__ == "Approval" + print(logs[0]) + assert logs[0].value == 0 # since everything got transferred + assert logs[0].owner.lower() == loaded_alice.lower() + assert logs[0].spender.lower() == bob.lower() + + print(logs[1]) + assert type(logs[1]).__name__ == "Transfer" + assert logs[1].value == amount + assert logs[1].sender.lower() == loaded_alice.lower() + assert logs[1].receiver.lower() == charlie.lower() diff --git a/tests/utils/constants.py b/tests/utils/constants.py index f841a02f..d46b1207 100644 --- a/tests/utils/constants.py +++ b/tests/utils/constants.py @@ -22,3 +22,5 @@ MIN_FEE = 5 * 10**5 MAX_FEE = 10 * 10**9 + +MIN_RAMP_TIME = 86400 diff --git a/tests/utils/strategies.py b/tests/utils/strategies.py index 2da6ba45..e842a166 100644 --- a/tests/utils/strategies.py +++ b/tests/utils/strategies.py @@ -10,10 +10,10 @@ from hypothesis.strategies import composite, integers, just, sampled_from # compiling contracts -from contracts.main import CurveCryptoMathOptimized2 as math_deployer -from contracts.main import CurveCryptoViews2Optimized as view_deployer -from contracts.main import CurveTwocryptoFactory as factory_deployer -from contracts.main import CurveTwocryptoOptimized as amm_deployer +from contracts.main import TwocryptoMath as math_deployer +from contracts.main import TwocryptoView as view_deployer +from contracts.main import TwocryptoFactory as factory_deployer +from contracts.main import Twocrypto as amm_deployer from contracts.main import LiquidityGauge as gauge_deployer from tests.utils.constants import ( MAX_A, diff --git a/uv.lock b/uv.lock index 1d9159ef..53eb5c75 100644 --- a/uv.lock +++ b/uv.lock @@ -841,19 +841,19 @@ wheels = [ [[package]] name = "jupyter" -version = "1.1.1" +version = "1.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ipykernel" }, { name = "ipywidgets" }, { name = "jupyter-console" }, - { name = "jupyterlab" }, { name = "nbconvert" }, { name = "notebook" }, + { name = "qtconsole" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/58/f3/af28ea964ab8bc1e472dba2e82627d36d470c51f5cd38c37502eeffaa25e/jupyter-1.1.1.tar.gz", hash = "sha256:d55467bceabdea49d7e3624af7e33d59c37fff53ed3a350e1ac957bed731de7a", size = 5714959 } +sdist = { url = "https://files.pythonhosted.org/packages/c9/a9/371d0b8fe37dd231cf4b2cff0a9f0f25e98f3a73c3771742444be27f2944/jupyter-1.0.0.tar.gz", hash = "sha256:d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f", size = 12916 } wheels = [ - { url = "https://files.pythonhosted.org/packages/38/64/285f20a31679bf547b75602702f7800e74dbabae36ef324f716c02804753/jupyter-1.1.1-py2.py3-none-any.whl", hash = "sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83", size = 2657 }, + { url = "https://files.pythonhosted.org/packages/83/df/0f5dd132200728a86190397e1ea87cd76244e42d39ec5e88efd25b2abd7e/jupyter-1.0.0-py2.py3-none-any.whl", hash = "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78", size = 2736 }, ] [[package]] @@ -1340,6 +1340,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef", size = 13307 }, ] +[[package]] +name = "numpy" +version = "2.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/d0/c12ddfd3a02274be06ffc71f3efc6d0e457b0409c4481596881e748cb264/numpy-2.2.2.tar.gz", hash = "sha256:ed6906f61834d687738d25988ae117683705636936cc605be0bb208b23df4d8f", size = 20233295 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/e6/847d15770ab7a01e807bdfcd4ead5bdae57c0092b7dc83878171b6af97bb/numpy-2.2.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ac9bea18d6d58a995fac1b2cb4488e17eceeac413af014b1dd26170b766d8467", size = 20912636 }, + { url = "https://files.pythonhosted.org/packages/d1/af/f83580891577b13bd7e261416120e036d0d8fb508c8a43a73e38928b794b/numpy-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23ae9f0c2d889b7b2d88a3791f6c09e2ef827c2446f1c4a3e3e76328ee4afd9a", size = 14098403 }, + { url = "https://files.pythonhosted.org/packages/2b/86/d019fb60a9d0f1d4cf04b014fe88a9135090adfadcc31c1fadbb071d7fa7/numpy-2.2.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3074634ea4d6df66be04f6728ee1d173cfded75d002c75fac79503a880bf3825", size = 5128938 }, + { url = "https://files.pythonhosted.org/packages/7a/1b/50985edb6f1ec495a1c36452e860476f5b7ecdc3fc59ea89ccad3c4926c5/numpy-2.2.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8ec0636d3f7d68520afc6ac2dc4b8341ddb725039de042faf0e311599f54eb37", size = 6661937 }, + { url = "https://files.pythonhosted.org/packages/f4/1b/17efd94cad1b9d605c3f8907fb06bcffc4ce4d1d14d46b95316cccccf2b9/numpy-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ffbb1acd69fdf8e89dd60ef6182ca90a743620957afb7066385a7bbe88dc748", size = 14049518 }, + { url = "https://files.pythonhosted.org/packages/5b/73/65d2f0b698df1731e851e3295eb29a5ab8aa06f763f7e4188647a809578d/numpy-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0349b025e15ea9d05c3d63f9657707a4e1d471128a3b1d876c095f328f8ff7f0", size = 16099146 }, + { url = "https://files.pythonhosted.org/packages/d5/69/308f55c0e19d4b5057b5df286c5433822e3c8039ede06d4051d96f1c2c4e/numpy-2.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:463247edcee4a5537841d5350bc87fe8e92d7dd0e8c71c995d2c6eecb8208278", size = 15246336 }, + { url = "https://files.pythonhosted.org/packages/f0/d8/d8d333ad0d8518d077a21aeea7b7c826eff766a2b1ce1194dea95ca0bacf/numpy-2.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9dd47ff0cb2a656ad69c38da850df3454da88ee9a6fde0ba79acceee0e79daba", size = 17863507 }, + { url = "https://files.pythonhosted.org/packages/82/6e/0b84ad3103ffc16d6673e63b5acbe7901b2af96c2837174c6318c98e27ab/numpy-2.2.2-cp312-cp312-win32.whl", hash = "sha256:4525b88c11906d5ab1b0ec1f290996c0020dd318af8b49acaa46f198b1ffc283", size = 6276491 }, + { url = "https://files.pythonhosted.org/packages/fc/84/7f801a42a67b9772a883223a0a1e12069a14626c81a732bd70aac57aebc1/numpy-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:5acea83b801e98541619af398cc0109ff48016955cc0818f478ee9ef1c5c3dcb", size = 12616372 }, +] + [[package]] name = "overrides" version = "7.7.0" @@ -1367,6 +1385,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746 }, ] +[[package]] +name = "pandas" +version = "2.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893 }, + { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475 }, + { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645 }, + { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445 }, + { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235 }, + { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756 }, + { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248 }, +] + [[package]] name = "pandocfilters" version = "1.5.1" @@ -1719,6 +1758,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4b/72/2f30cf26664fcfa0bd8ec5ee62ec90c03bd485e4a294d92aabc76c5203a5/python_json_logger-3.2.1-py3-none-any.whl", hash = "sha256:cdc17047eb5374bd311e748b42f99d71223f3b0e186f4206cc5d52aefe85b090", size = 14924 }, ] +[[package]] +name = "pytz" +version = "2024.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/31/3c70bf7603cc2dca0f19bdc53b4537a797747a58875b552c8c413d963a3f/pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a", size = 319692 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/c3/005fcca25ce078d2cc29fd559379817424e94885510568bc1bc53d7d5846/pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725", size = 508002 }, +] + [[package]] name = "pywin32" version = "308" @@ -1790,6 +1838,36 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5f/0e/eb16ff731632d30554bf5af4dbba3ffcd04518219d82028aea4ae1b02ca5/pyzmq-26.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b", size = 540675 }, ] +[[package]] +name = "qtconsole" +version = "5.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ipykernel" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "packaging" }, + { name = "pygments" }, + { name = "qtpy" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f1/83/d2b11f2f737c276d8650a04ad3bf478d10fbcd55fe39f129cdb9e6843d31/qtconsole-5.6.1.tar.gz", hash = "sha256:5cad1c7e6c75d3ef8143857fd2ed28062b4b92b933c2cc328252d18a9cfd0be5", size = 435808 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/8a/635610fb6131bc702229e2780d7b042416866ab78f8ed1ff24c4b23a2f4c/qtconsole-5.6.1-py3-none-any.whl", hash = "sha256:3d22490d9589bace566ad4f3455b61fa2209156f40e87e19e2c3cb64e9264950", size = 125035 }, +] + +[[package]] +name = "qtpy" +version = "2.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e5/10/51e0e50dd1e4a160c54ac0717b8ff11b2063d441e721c2037f61931cf38d/qtpy-2.4.2.tar.gz", hash = "sha256:9d6ec91a587cc1495eaebd23130f7619afa5cdd34a277acb87735b4ad7c65156", size = 66849 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/0c/58a1e48209b0b1220ca2368435573f39ff1fa3577b7eef913f8960c5d429/QtPy-2.4.2-py3-none-any.whl", hash = "sha256:5a696b1dd7a354cb330657da1d17c20c2190c72d4888ba923f8461da67aa1a1c", size = 95155 }, +] + [[package]] name = "referencing" version = "0.36.1" @@ -2112,9 +2190,11 @@ dependencies = [ [package.dev-dependencies] dev = [ + { name = "eth-account" }, { name = "hypothesis" }, { name = "jupyter" }, { name = "mamushi" }, + { name = "pandas" }, { name = "plyvel-ci" }, { name = "pre-commit" }, { name = "pytest" }, @@ -2131,14 +2211,16 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ - { name = "hypothesis" }, - { name = "jupyter", specifier = ">=1.0.0" }, + { name = "eth-account", specifier = ">=0.13.4" }, + { name = "hypothesis", specifier = "==6.124.2" }, + { name = "jupyter", specifier = "==1.0.0" }, { name = "mamushi", specifier = "==0.0.4" }, + { name = "pandas", specifier = "==2.2.3" }, { name = "plyvel-ci", specifier = "==1.5.1" }, { name = "pre-commit", specifier = "==3.8.0" }, { name = "pytest", specifier = "==8.2.2" }, - { name = "pytest-xdist", specifier = ">=3.6.1" }, - { name = "python-dotenv", specifier = ">=1.0.1" }, + { name = "pytest-xdist", specifier = "==3.6.1" }, + { name = "python-dotenv", specifier = "==1.0.1" }, { name = "ruff", specifier = "==0.6.9" }, ] @@ -2160,6 +2242,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, ] +[[package]] +name = "tzdata" +version = "2025.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/0f/fa4723f22942480be4ca9527bbde8d43f6c3f2fe8412f00e7f5f6746bc8b/tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694", size = 194950 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639", size = 346762 }, +] + [[package]] name = "uri-template" version = "1.3.0"