UNPKG

mev-inspect

Version:

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

102 lines 3.02 kB
import { Contract } from 'ethcall'; import pairAbi from '../../abi/uniswapV2Pair.js'; import { equalWithTolerance } from '../../utils.js'; import { getLatestPoolTransfer, } from '../base.js'; function isValid(event) { return event.name === 'Swap'; } function getPoolCalls(address) { const pairContract = new Contract(address, pairAbi); const factoryCall = pairContract.factory(); const asset0Call = pairContract.token0(); const asset1Call = pairContract.token1(); return [factoryCall, asset0Call, asset1Call]; } function processPoolCalls(result) { const factory = result[0]; const asset0 = result[1]; const asset1 = result[2]; if (!factory || !asset0 || !asset1) { return null; } const assets = [asset0.toLowerCase(), asset1.toLowerCase()]; return { factoryAddress: factory.toLowerCase(), assets, }; } function parse(pool, event, transfers) { const { values, transactionFrom, transactionHash: hash, transactionIndex, gasUsed, logIndex, address, blockHash, blockNumber, } = event; const { assets } = pool; const poolTransfer = getLatestPoolTransfer(pool.address, logIndex, transfers); if (!poolTransfer) { return null; } const from = poolTransfer.from; const to = values.to.toLowerCase(); const amount0In = values.amount0In; const amount1In = values.amount1In; const amount0Out = values.amount0Out; const amount1Out = values.amount1Out; const assetOut = amount0In === 0n ? assets[0] : assets[1]; const amountOut = amount0In === 0n ? amount0Out : amount1Out; const assetIn = amount0In === 0n ? assets[1] : assets[0]; const amountIn = amount0In === 0n ? amount1In : amount0In; if (poolTransfer.event.address !== assetIn) { return null; } if (!equalWithTolerance(poolTransfer.value, amountIn, 0.001)) { return null; } return { contract: { address: pool.address, protocol: { abi: 'UniswapV2', factory: pool.factory, }, }, block: { hash: blockHash, number: blockNumber, }, transaction: { from: transactionFrom.toLowerCase(), hash, index: transactionIndex, gasUsed, }, event: { address: address.toLowerCase(), logIndex, }, from, to, assetIn: { type: 'erc20', address: assetIn, }, amountIn, assetOut: { type: 'erc20', address: assetOut, }, amountOut, metadata: {}, }; } const CLASSIFIER = { swap: { type: 'swap', protocol: 'UniswapV2', abi: pairAbi, isValid, parse, pool: { getCalls: getPoolCalls, processCalls: processPoolCalls, }, }, }; export default CLASSIFIER; //# sourceMappingURL=uniswapV2.js.map