UNPKG

mev-inspect

Version:

A JS port of 'mev-inspect-py' optimised for ease of use.

92 lines (65 loc) 3.27 kB
# MEV Inspect A JS port of `mev-inspect-py` optimised for ease of use. ## Motivation While mev-inspect-py is great, I believe that there are a few changes can be made to make historical MEV data more accessible. Here are some defining decisions for this port: - Written in Typescript: easier to run in browser/node, while keeping the code type-safe - Infra layer decoupling: message query, caching, and persistence layers can be added independenty when/if needed - Pricing data decoupling: to calculate profit and cost in USD, a pricing provider of your choice can be used - Single transaction inspection: while missing some types of MEV, this is helpful for quick transaction review - Using logs instead of call traces: any historical node would work Other, less fundamental, changes include: - Fork support (e.g. Sushiswap) - Multichain support - Abilitiy to "bring your own transaction receipts" (e.g. via Alchemy) ## API - Inspector - constructor(chainId, provider) - tx(hash): processes a single transaction given hash - block(number): processes a single block given number - receipts(receipts): processes an arbitrary amount of transaction receipts - getBlock(mev): get MEV block number - getTransaction(mev): get MEV transaction hash - getArbitrages(mevList): filter out non-arbitrage MEV - getLiquidations(mevList): filter out non-liquidation MEV - getSandwiches(mevList): filter out non-sandwich MEV - getJitSandwiches(mevList): filter out non-JIT liquidity sandwich MEV - getNftArbitrages(mevList): filter out non-NFT arbitrage MEV A common data flow is to first fetch all the MEV using any of the Inspector method, then filter it by type using `getArbitrages`, etc, and finally process each type of MEV separately ## Usage > This package requires ethers V6. If you use ethers V5, you need to use mev-inspect V3. > This package uses [BigInt](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt). If you use a bundler, you may want to set the build target to `es2020`. > This package is a pure ESM package. Follow [this guide](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c) for more info. ```bash npm i mev-inspect ``` ```ts import { ethers } from 'ethers'; import { Inspector } from 'mev-inspect'; const arbitrageTx = '0x06387618ee3752bed447f192802895921a7d45a60875927adfedc93a68bcbe05'; const key = process.env.PROVIDER_KEY; const provider = new ethers.providers.AlchemyProvider(1, key); const inspector = new Inspector(1, provider); const txMev = await inspector.tx(arbitrageTx); console.log(txMev); ``` For more examlples, see [`examples`](./examples/). ## Support ### MEV type - Arbitrage - Liquidations - Sandwiches - JIT liquidity sandwiches - NFT arbitrage ### Chains - Ethereum - Polygon - Arbitrum - Optimism - Avalanche ### Protocols - Swaps: Uniswap V2/V3 (+ forks), Balancer V1/V2, Curve V1/V2, 0x V3/V4, Bancor V2/V3 - Lending: Compound V2 (+ forks), Aave V1/V2/V3 - NFT swaps: Opensea (Seaport), LooksRare, Sudoswap, X2Y2 ## How it works It starts by fetching all event logs for a given transaction or block. Then, it "sorts" logs based on their source and type. From those logs, it extracts swap data. It then analyzes the swaps to find arbitrage.