97 lines
2.8 KiB
Python
97 lines
2.8 KiB
Python
import asyncio
|
|
import logging
|
|
import os
|
|
|
|
from aiohttp_retry import ExponentialRetry, RetryClient
|
|
|
|
from mev_inspect.block import get_latest_block_number
|
|
from mev_inspect.concurrency import coro
|
|
from mev_inspect.crud.latest_block_update import find_latest_block_update
|
|
from mev_inspect.db import get_inspect_session
|
|
from mev_inspect.inspector import MEVInspector
|
|
from mev_inspect.signal_handler import GracefulKiller
|
|
|
|
logging.basicConfig(filename="listener.log", filemode="a", level=logging.INFO)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
# lag to make sure the blocks we see are settled
|
|
BLOCK_NUMBER_LAG = 5
|
|
SLEEP_TIME = 24 * 60 * 60
|
|
STRIDE_SIZE = 500000
|
|
|
|
|
|
@coro
|
|
async def run():
|
|
rpc = os.getenv("RPC_URL")
|
|
if rpc is None:
|
|
raise RuntimeError("Missing environment variable RPC_URL")
|
|
|
|
logger.info("Starting...")
|
|
|
|
killer = GracefulKiller()
|
|
|
|
inspector = MEVInspector(rpc)
|
|
while not killer.kill_now:
|
|
await asyncio.gather(
|
|
inspect_next_many_blocks(
|
|
inspector,
|
|
),
|
|
asyncio.sleep(SLEEP_TIME),
|
|
)
|
|
logger.info("Stopping...")
|
|
|
|
|
|
async def inspect_next_many_blocks(
|
|
inspector: MEVInspector,
|
|
):
|
|
with get_inspect_session() as inspect_db_session:
|
|
latest_block_number = await get_latest_block_number(inspector.w3)
|
|
last_written_block = find_latest_block_update(inspect_db_session)
|
|
|
|
logger.info(f"Latest block: {latest_block_number}")
|
|
logger.info(f"Last written block: {last_written_block}")
|
|
|
|
if last_written_block is None:
|
|
# maintain lag if no blocks written yet
|
|
last_written_block = latest_block_number - BLOCK_NUMBER_LAG - 1
|
|
|
|
for start_block_number in range(
|
|
last_written_block + 1, latest_block_number, STRIDE_SIZE
|
|
):
|
|
end_block_number = start_block_number + STRIDE_SIZE
|
|
end_block_number = (
|
|
end_block_number
|
|
if end_block_number <= latest_block_number
|
|
else latest_block_number
|
|
)
|
|
logger.info(
|
|
f"Inpecting blocks started: {start_block_number} to {end_block_number}"
|
|
)
|
|
with get_inspect_session() as inspect_db_session:
|
|
await inspector.inspect_many_blocks(
|
|
inspect_db_session=inspect_db_session,
|
|
trace_db_session=None,
|
|
after_block=start_block_number,
|
|
before_block=end_block_number,
|
|
)
|
|
logger.info(
|
|
f"Inpecting blocks ended: {start_block_number} to {end_block_number}"
|
|
)
|
|
|
|
|
|
async def ping_healthcheck_url(url):
|
|
retry_options = ExponentialRetry(attempts=3)
|
|
|
|
async with RetryClient(
|
|
raise_for_status=False, retry_options=retry_options
|
|
) as client:
|
|
async with client.get(url) as _response:
|
|
pass
|
|
|
|
|
|
if __name__ == "__main__":
|
|
try:
|
|
run()
|
|
except Exception as e:
|
|
logger.error(e)
|