from concurrent.futures import ThreadPoolExecutor, as_completed import pytest from web3 import Web3 from .network import setup_ethermint from .utils import ADDRS, send_transaction @pytest.fixture(scope="module") def custom_ethermint(tmp_path_factory): path = tmp_path_factory.mktemp("fee-history") yield from setup_ethermint(path, 26500, long_timeout_commit=True) @pytest.fixture(scope="module", params=["ethermint", "geth"]) def cluster(request, custom_ethermint, geth): """ run on both ethermint and geth """ provider = request.param if provider == "ethermint": yield custom_ethermint elif provider == "geth": yield geth else: raise NotImplementedError def test_basic(cluster): w3: Web3 = cluster.w3 call = w3.provider.make_request tx = {"to": ADDRS["community"], "value": 10, "gasPrice": w3.eth.gas_price} send_transaction(w3, tx) size = 4 # size of base fee + next fee max = size + 1 # only 1 base fee + next fee min = 2 method = "eth_feeHistory" field = "baseFeePerGas" percentiles = [100] height = w3.eth.block_number latest = dict( blocks=["latest", hex(height)], expect=max, ) earliest = dict( blocks=["earliest", "0x0"], expect=min, ) for tc in [latest, earliest]: res = [] with ThreadPoolExecutor(len(tc["blocks"])) as exec: tasks = [ exec.submit(call, method, [size, b, percentiles]) for b in tc["blocks"] ] res = [future.result()["result"][field] for future in as_completed(tasks)] assert len(res) == len(tc["blocks"]) assert res[0] == res[1] assert len(res[0]) == tc["expect"] for x in range(max): i = x + 1 fee_history = call(method, [size, hex(i), percentiles]) # start to reduce diff on i <= size - min diff = size - min - i reduce = size - diff target = reduce if diff >= 0 else max res = fee_history["result"] assert len(res[field]) == target oldest = i + min - max assert res["oldestBlock"] == hex(oldest if oldest > 0 else 0)