UNPKG

mev-inspect

Version:

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

360 lines 10.7 kB
import poolAbi from '../../abi/curveV2.js'; import { getFactories } from '../directory.js'; function isValidSwap(event, address, chain) { return (isValidPool(address, chain) && (event.name === 'TokenExchange' || event.name === 'TokenExchangeUnderlying')); } function isValidDeposit(event, address, chain) { return isValidPool(address, chain) && event.name === 'AddLiquidity'; } function isValidWithdrawal(event, address, chain) { return (isValidPool(address, chain) && (event.name === 'RemoveLiquidity' || event.name === 'RemoveLiquidityImbalance' || event.name === 'RemoveLiquidityOne')); } function getPoolCalls() { return []; } function processPoolCalls(_results, address) { const pool = pools.find((pool) => pool.address === address.toLowerCase()); if (!pool) { return null; } const factory = getFactories(pool.chainId, 'CurveV2')[0]; if (!factory) { return null; } return { factoryAddress: factory.address, assets: pool.assets, }; } function parseSwap(pool, event) { const { values, transactionFrom, transactionHash: hash, transactionIndex, gasUsed, logIndex, address, blockHash, blockNumber, } = event; const buyer = values.buyer.toLowerCase(); const sold_id = values.sold_id; const tokens_sold = values.tokens_sold; const bought_id = values.bought_id; const tokens_bought = values.tokens_bought; const curvePool = pools.find((curvePool) => curvePool.address === pool.address); if (!curvePool) { return null; } const assets = event.name === 'TokenExchange' ? pool.assets : curvePool.metapoolAssets || curvePool.underlyingAssets || curvePool.assets; const from = buyer; const to = buyer; const assetOut = assets[bought_id]; const amountOut = tokens_bought; const assetIn = assets[sold_id]; const amountIn = tokens_sold; return { contract: { address, protocol: { abi: 'CurveV2', 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: {}, }; } function parseDeposit(pool, event) { const { values, transactionFrom, transactionHash: hash, transactionIndex, gasUsed, logIndex, address, blockHash, blockNumber, } = event; const { assets } = pool; const depositor = values.provider.toLowerCase(); const amounts = values.token_amounts; return { contract: { address: pool.address, protocol: { abi: 'CurveV2', factory: pool.factory, }, }, block: { hash: blockHash, number: blockNumber, }, transaction: { from: transactionFrom.toLowerCase(), hash, index: transactionIndex, gasUsed, }, event: { address: address.toLowerCase(), logIndex, }, depositor, assets: assets.map((asset) => { return { type: 'erc20', address: asset, }; }), amounts, metadata: {}, }; } function parseWithdrawal(pool, event) { const { values, transactionFrom, transactionHash: hash, transactionIndex, gasUsed, logIndex, address, blockHash, blockNumber, } = event; const withdrawer = values.provider.toLowerCase(); const assets = event.name === 'RemoveLiquidityOne' ? [pool.assets[parseInt(values.coin_index.toString())]] : pool.assets; const amounts = event.name === 'RemoveLiquidityOne' ? [values.coin_amount] : values.token_amounts; return { contract: { address: pool.address, protocol: { abi: 'CurveV2', factory: pool.factory, }, }, block: { hash: blockHash, number: blockNumber, }, transaction: { from: transactionFrom.toLowerCase(), hash, index: transactionIndex, gasUsed, }, event: { address: address.toLowerCase(), logIndex, }, withdrawer, assets: assets.map((asset) => { return { type: 'erc20', address: asset, }; }), amounts, metadata: {}, }; } function isValidPool(address, chain) { return pools.some((pool) => pool.chainId === chain && pool.address === address.toLowerCase()); } const pools = [ // Ethereum { chainId: 1, address: '0x80466c64868e1ab14a1ddf27a676c3fcbe638fe5', assets: [ '0xdac17f958d2ee523a2206206994597c13d831ec7', '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599', '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', ], }, { chainId: 1, address: '0xd51a44d3fae010294c616388b506acda1bfaae46', assets: [ '0xdac17f958d2ee523a2206206994597c13d831ec7', '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599', '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', ], }, { chainId: 1, address: '0x9838eccc42659fa8aa7daf2ad134b53984c9427b', assets: [ '0xc581b735a1688071a1746c968e0798d642ede491', '0x6c3f90f043a72fa612cbac8115ee7e52bde6e490', ], }, { chainId: 1, address: '0x98a7f18d4e56cfe84e3d081b40001b3d5bd3eb8b', assets: [ '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', '0xdb25f211ab05b1c97d595516f45794528a807ad8', ], }, { chainId: 1, address: '0x8301ae4fc9c624d1d396cbdaa1ed877821d7c511', assets: [ '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', '0xd533a949740bb3306d119cc777fa900ba034cd52', ], }, { chainId: 1, address: '0xb576491f1e6e5e62f1d8f26062ee822b40b0e0d4', assets: [ '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', '0x4e3fbd56cd56c3e72c1403e103b45db9da5b9d2b', ], }, { chainId: 1, address: '0xadcfcf9894335dc340f6cd182afa45999f45fc44', assets: [ '0x68749665ff8d2d112fa859aa293f07a622782f38', '0x6c3f90f043a72fa612cbac8115ee7e52bde6e490', ], }, { chainId: 1, address: '0x98638facf9a3865cd033f36548713183f6996122', assets: [ '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', '0x090185f2135308bad17527004364ebcc2d37e5f6', ], }, { chainId: 1, address: '0x752ebeb79963cf0732e9c0fec72a49fd1defaeac', assets: [ '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', '0xcdf7028ceab81fa0c6971208e83fa7872994bee5', ], }, // Polygon { chainId: 137, address: '0x751b1e21756bdbc307cbcc5085c042a0e9aaef36', assets: [ '0xe7a24ef0c5e95ffb0f6684b813a78f2a3ad7d171', '0x5c2ed810328349100a66b82b78a1791b101c9d61', '0x28424507fefb6f7f8e9d3860f56504e4e5f5f390', ], }, { chainId: 137, address: '0x92577943c7ac4accb35288ab2cc84d75fec330af', assets: [ '0xe7a24ef0c5e95ffb0f6684b813a78f2a3ad7d171', '0x5c2ed810328349100a66b82b78a1791b101c9d61', '0x28424507fefb6f7f8e9d3860f56504e4e5f5f390', ], }, { chainId: 137, address: '0x92215849c439e1f8612b6646060b4e3e5ef822cc', assets: [ '0xe7a24ef0c5e95ffb0f6684b813a78f2a3ad7d171', '0x5c2ed810328349100a66b82b78a1791b101c9d61', '0x28424507fefb6f7f8e9d3860f56504e4e5f5f390', ], }, { chainId: 137, address: '0xb446bf7b8d6d4276d0c75ec0e3ee8dd7fe15783a', assets: [ '0x7bdf330f423ea880ff95fc41a280fd5ecfd3d09f', '0xe7a24ef0c5e95ffb0f6684b813a78f2a3ad7d171', ], }, { chainId: 137, address: '0x9b3d675fdbe6a0935e8b7d1941bc6f78253549b7', assets: [ '0xe111178a87a3bff0c8d18decba5798827539ae99', '0xe7a24ef0c5e95ffb0f6684b813a78f2a3ad7d171', ], }, // Arbitrum { chainId: 42161, address: '0x960ea3e3c7fb317332d990873d354e18d7645590', assets: [ '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9', '0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f', '0x82af49447d8a07e3bd95bd0d56f35241523fbab1', ], }, { chainId: 42161, address: '0xa827a652ead76c6b0b3d19dba05452e06e25c27e', assets: [ '0xd22a58f79e9481d1a88e00c343885a588b34b68b', '0x7f90122bf0700f9e7e1f688fe926940e8839f353', ], }, // Avalanche { chainId: 43114, address: '0xb755b949c126c04e0348dd881a5cf55d424742b2', assets: [ '0x1337bedc9d22ecbe766df105c9623922a27963ec', '0x686bef2417b6dc32c50a3cbfbcc3bb60e1e9a15d', '0x53f7c5869a859f0aec3d334ee8b4cf01e3492f21', ], }, ]; const CLASSIFIER = { swap: { type: 'swap', protocol: 'CurveV2', abi: poolAbi, isValid: isValidSwap, parse: parseSwap, pool: { getCalls: getPoolCalls, processCalls: processPoolCalls, }, }, liquidityDeposit: { type: 'liquidity_deposit', protocol: 'CurveV2', abi: poolAbi, isValid: isValidDeposit, parse: parseDeposit, pool: { getCalls: getPoolCalls, processCalls: processPoolCalls, }, }, liquidityWithdrawal: { type: 'liquidity_withdrawal', protocol: 'CurveV2', abi: poolAbi, isValid: isValidWithdrawal, parse: parseWithdrawal, pool: { getCalls: getPoolCalls, processCalls: processPoolCalls, }, }, }; export default CLASSIFIER; //# sourceMappingURL=curveV2.js.map