dioh / mev-inspect-py

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

mev-inspect-py

illuminating the dark forest 🌲💡

mev-inspect-py is an MEV inspector for Ethereum

Given a block, mev-inspect finds:

  • miner payments (gas + coinbase)
  • tokens transfers and profit
  • swaps and arbitrages
  • ...and more

Data is stored in Postgres for analysis

Running locally

mev-inspect-py is built to run on kubernetes locally and in production

Install dependencies

First, setup a local kubernetes deployment - we use Docker and kind

If using kind, create a new cluster with:

kind create cluster

Next, install the kubernetes CLI kubectl

Then, install helm - helm is a package manager for kubernetes

Lastly, setup Tilt which manages running and updating kubernetes resources locally

Start up

Set an environment variable RPC_URL to an RPC for fetching blocks Example:

export RPC_URL="http://111.111.111.111:8546"

Note: mev-inspect-py currently requires an RPC with support for Erigon traces and receipts (not geth 😔)

Next, start all services with:

tilt up

Press "space" to see a browser of the services starting up

On first startup, you'll need to apply database migrations. Apply with:

kubectl exec deploy/mev-inspect -- alembic upgrade head

Inspecting

Inspect a single block

Inspecting block 12914944

kubectl exec deploy/mev-inspect -- poetry run inspect-block 12914944

Inspect many blocks

Inspecting blocks 12914944 to 12914954

kubectl exec deploy/mev-inspect -- poetry run inspect-many-blocks 12914944 12914954

Inspect all incoming blocks

Start a block listener with

kubectl exec deploy/mev-inspect -- /app/listener start

By default, it will pick up wherever you left off. If running for the first time, listener starts at the latest block

See logs for the listener with

kubectl exec deploy/mev-inspect -- tail -f listener.log

And stop the listener with

kubectl exec deploy/mev-inspect -- /app/listener stop

Exploring

All inspect output data is stored in Postgres.

To connect to the local Postgres database for querying, launch a client container with:

kubectl run -i --rm --tty postgres-client --env="PGPASSWORD=password" --image=jbergknoff/postgresql-client -- mev_inspect --host=postgresql --user=postgres

When you see the prompt

mev_inspect=#

You're ready to query!

Try finding the total number of swaps decoded with UniswapV3Pool

SELECT COUNT(*) FROM swaps WHERE abi_name='UniswapV3Pool';

or top 10 arbs by gross profit that took profit in WETH

SELECT *
FROM arbitrages
WHERE profit_token_address = '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2'
ORDER BY profit_amount DESC
LIMIT 10;

Postgres tip: Enter \x to enter "Explanded display" mode which looks nicer for results with many columns

Contributing

Guide

✨ Coming soon

Pre-commit

We use pre-commit to maintain a consistent style, prevent errors, and ensure test coverage.

To set up, install dependencies through poetry

poetry install

Then install pre-commit hooks with

poetry run pre-commit install

Tests

Run tests with

kubectl exec deploy/mev-inspect -- poetry run pytest --cov=mev_inspect tests

FAQ

How do I delete / reset my local postgres data?

Stop the system if running

tilt down

Delete it with

kubectl delete pvc data-postgresql-postgresql-0

Start back up again

tilt up

And rerun migrations to create the tables again

kubectl exec deploy/mev-inspect -- alembic upgrade head

I was using the docker-compose setup and want to switch to kube, now what?

Re-add the old docker-compose.yml file to your mev-inspect-py directory

A copy can be found here

Tear down docker-compose resources

docker compose down

Then go through the steps in the current README for kube setup

Error from server (AlreadyExists): pods "postgres-client" already exists

This means the postgres client container didn't shut down correctly

Delete this one with

kubectl delete pod/postgres-client

Then start it back up again

About


Languages

Language:Python 84.7%Language:Starlark 10.0%Language:Shell 2.0%Language:Go 1.6%Language:Smarty 0.9%Language:Dockerfile 0.5%Language:Mako 0.3%