From 0c4f6052296ac2bbdfbc7f662ea61711f74bafb4 Mon Sep 17 00:00:00 2001 From: Luke Van Seters Date: Tue, 12 Oct 2021 12:19:09 -0400 Subject: [PATCH 1/3] Write protocol for swaps --- mev_inspect/swaps.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mev_inspect/swaps.py b/mev_inspect/swaps.py index ce08770..f6645db 100644 --- a/mev_inspect/swaps.py +++ b/mev_inspect/swaps.py @@ -96,6 +96,7 @@ def _parse_swap( block_number=trace.block_number, trace_address=trace.trace_address, pool_address=pool_address, + protocol=trace.protocol, from_address=transfer_in.from_address, to_address=transfer_out.to_address, token_in_address=transfer_in.token_address, From 547b51df924035bff67378a2eb128c8721a7723b Mon Sep 17 00:00:00 2001 From: Luke Van Seters Date: Fri, 8 Oct 2021 12:19:33 -0400 Subject: [PATCH 2/3] Add swap support for curve --- mev_inspect/classifiers/specs/curve.py | 215 +++++++++++++++---------- 1 file changed, 130 insertions(+), 85 deletions(-) diff --git a/mev_inspect/classifiers/specs/curve.py b/mev_inspect/classifiers/specs/curve.py index a631b8c..775923d 100644 --- a/mev_inspect/classifiers/specs/curve.py +++ b/mev_inspect/classifiers/specs/curve.py @@ -4,29 +4,17 @@ from mev_inspect.schemas.classified_traces import ( from mev_inspect.schemas.classifiers import ( ClassifierSpec, + DecodedCallTrace, + SwapClassifier, ) -""" -Deployment addresses found here -https://curve.readthedocs.io/ref-addresses.html -organized into 3 groups -1. Base Pools: 2 or more tokens implementing stable swap - - StableSwap - - Deposit - - CurveContract - - CurveTokenV1/V2 -2. Meta Pools: 1 token trading with an LP from above - - StableSwap - - Deposit - - CurveTokenV1/V2 -3. Liquidity Gauges: stake LP get curve governance token? - - LiquidityGauge - - LiquidityGaugeV1/V2 - - LiquidityGaugeReward -4. DAO stuff -5..? Other stuff, haven't decided if important -""" +class CurveSwapClassifier(SwapClassifier): + @staticmethod + def get_swap_recipient(trace: DecodedCallTrace) -> str: + return trace.from_address + + CURVE_BASE_POOLS = [ ClassifierSpec( abi_name="CurveTokenV1", @@ -75,101 +63,171 @@ CURVE_BASE_POOLS = [ abi_name="StableSwap3Pool", protocol=Protocol.curve, valid_contract_addresses=["0xbEbc44782C7dB0a1A60Cb6fe97d0b483032FF1C7"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwapAAVE", protocol=Protocol.curve, valid_contract_addresses=["0xDeBF20617708857ebe4F679508E7b7863a8A8EeE"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + "exchange_underlying(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwapAETH", protocol=Protocol.curve, valid_contract_addresses=["0xA96A65c051bF88B4095Ee1f2451C2A9d43F53Ae2"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwapBUSD", protocol=Protocol.curve, valid_contract_addresses=["0x79a8C46DeA5aDa233ABaFFD40F3A0A2B1e5A4F27"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + "exchange_underlying(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwapCompound", protocol=Protocol.curve, valid_contract_addresses=["0xA2B47E3D5c44877cca798226B7B8118F9BFb7A56"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + "exchange_underlying(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwapEURS", protocol=Protocol.curve, valid_contract_addresses=["0x0Ce6a5fF5217e38315f87032CF90686C96627CAA"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwaphBTC", protocol=Protocol.curve, valid_contract_addresses=["0x4CA9b3063Ec5866A4B82E437059D2C43d1be596F"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwapIronBank", protocol=Protocol.curve, valid_contract_addresses=["0x2dded6Da1BF5DBdF597C45fcFaa3194e53EcfeAF"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + "exchange_underlying(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwapLink", protocol=Protocol.curve, valid_contract_addresses=["0xf178c0b5bb7e7abf4e12a4838c7b7c5ba2c623c0"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwapPAX", protocol=Protocol.curve, valid_contract_addresses=["0x06364f10B501e868329afBc005b3492902d6C763"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + "exchange_underlying(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwaprenBTC", protocol=Protocol.curve, valid_contract_addresses=["0x93054188d876f558f4a66B2EF1d97d16eDf0895B"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwaprETH", protocol=Protocol.curve, valid_contract_addresses=["0xF9440930043eb3997fc70e1339dBb11F341de7A8"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwapsAAVE", protocol=Protocol.curve, valid_contract_addresses=["0xEB16Ae0052ed37f479f7fe63849198Df1765a733"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + "exchange_underlying(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwapsBTC", protocol=Protocol.curve, valid_contract_addresses=["0x7fC77b5c7614E1533320Ea6DDc2Eb61fa00A9714"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwapsETH", protocol=Protocol.curve, valid_contract_addresses=["0xc5424B857f758E906013F3555Dad202e4bdB4567"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwapstETH", protocol=Protocol.curve, valid_contract_addresses=["0xDC24316b9AE028F1497c275EB9192a3Ea0f67022"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwapsUSD", protocol=Protocol.curve, valid_contract_addresses=["0xA5407eAE9Ba41422680e2e00537571bcC53efBfD"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + "exchange_underlying(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwapUSDT", protocol=Protocol.curve, valid_contract_addresses=["0x52EA46506B9CC5Ef470C5bf89f17Dc28bB35D85C"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + "exchange_underlying(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwapY", protocol=Protocol.curve, valid_contract_addresses=["0x45F783CCE6B7FF23B2ab2D70e416cdb7D6055f51"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + "exchange_underlying(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwapYv2", protocol=Protocol.curve, valid_contract_addresses=["0x8925D9d9B4569D737a48499DeF3f67BaA5a144b9"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + "exchange_underlying(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="DepositBUSD", @@ -303,51 +361,91 @@ CURVE_META_POOLS = [ abi_name="StableSwapbBTC", protocol=Protocol.curve, valid_contract_addresses=["0x071c661B4DeefB59E2a3DdB20Db036821eeE8F4b"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + "exchange_underlying(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwapDUSD", protocol=Protocol.curve, valid_contract_addresses=["0x8038C01A0390a8c547446a0b2c18fc9aEFEcc10c"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + "exchange_underlying(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwapGUSD", protocol=Protocol.curve, valid_contract_addresses=["0x4f062658EaAF2C1ccf8C8e36D6824CDf41167956"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + "exchange_underlying(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwapHUSD", protocol=Protocol.curve, valid_contract_addresses=["0x3eF6A01A0f81D6046290f3e2A8c5b843e738E604"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + "exchange_underlying(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwapLinkUSD", protocol=Protocol.curve, valid_contract_addresses=["0xE7a24EF0C5e95Ffb0f6684b813A78F2a3AD7D171"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + "exchange_underlying(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwapMUSD", protocol=Protocol.curve, valid_contract_addresses=["0x8474DdbE98F5aA3179B3B3F5942D724aFcdec9f6"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + "exchange_underlying(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwapoBTC", protocol=Protocol.curve, valid_contract_addresses=["0xd81dA8D904b52208541Bade1bD6595D8a251F8dd"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + "exchange_underlying(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwappBTC", protocol=Protocol.curve, valid_contract_addresses=["0x7F55DDe206dbAD629C080068923b36fe9D6bDBeF"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + "exchange_underlying(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwapRSV", protocol=Protocol.curve, valid_contract_addresses=["0xC18cC39da8b11dA8c3541C598eE022258F9744da"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + "exchange_underlying(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwaptBTC", protocol=Protocol.curve, valid_contract_addresses=["0xC25099792E9349C7DD09759744ea681C7de2cb66"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + "exchange_underlying(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwapUSD", @@ -356,82 +454,29 @@ CURVE_META_POOLS = [ "0x3E01dD8a5E1fb3481F0F589056b428Fc308AF0Fb", "0x0f9cb53Ebe405d49A0bbdBD291A65Ff571bC83e1", ], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + "exchange_underlying(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwapUSDP", protocol=Protocol.curve, valid_contract_addresses=["0x42d7025938bEc20B69cBae5A77421082407f053A"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + "exchange_underlying(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ClassifierSpec( abi_name="StableSwapUST", protocol=Protocol.curve, valid_contract_addresses=["0x890f4e345B1dAED0367A877a1612f86A1f86985f"], + classifiers={ + "exchange(int128,int128,uint256,uint256)": CurveSwapClassifier, + "exchange_underlying(int128,int128,uint256,uint256)": CurveSwapClassifier, + }, ), ] -""" -CURVE_LIQUIDITY_GAUGES = [ - ClassifierSpec( - abi_name="LiquidityGauge", - protocol=Protocol.curve, - valid_contract_addresses=[ - "0xbFcF63294aD7105dEa65aA58F8AE5BE2D9d0952A", # 3Pool - "0x69Fb7c45726cfE2baDeE8317005d3F94bE838840", # BUSD - "0x7ca5b0a2910B33e9759DC7dDB0413949071D7575", # Compound - "0xC5cfaDA84E902aD92DD40194f0883ad49639b023", # GUSD - "0x4c18E409Dc8619bFb6a1cB56D114C3f592E0aE79", # hBTC - "0x2db0E83599a91b508Ac268a6197b8B14F5e72840", # HUSD - "0x64E3C23bfc40722d3B649844055F1D51c1ac041d", # PAX - "0xB1F2cdeC61db658F091671F5f199635aEF202CAC", # renBTC - "0xC2b1DF84112619D190193E48148000e3990Bf627", # USDK - "0xF98450B5602fa59CC66e1379DFfB6FDDc724CfC4", # USDN - "0xBC89cd85491d81C6AD2954E6d0362Ee29fCa8F53", # USDT - "0xFA712EE4788C042e2B7BB55E6cb8ec569C4530c1", # Y - ], - ), - ClassifierSpec( - abi_name="LiquidityGaugeV2", - protocol=Protocol.curve, - valid_contract_addresses=[ - "0xd662908ADA2Ea1916B3318327A97eB18aD588b5d", # AAVE - "0x6d10ed2cF043E6fcf51A0e7b4C2Af3Fa06695707", # ankrETH - "0xdFc7AdFa664b08767b735dE28f9E84cd30492aeE", # bBTC - "0x90Bb609649E0451E5aD952683D64BD2d1f245840", # EURS - "0x72e158d38dbd50a483501c24f792bdaaa3e7d55c", # FRAX - "0x11137B10C210b579405c21A07489e28F3c040AB1", # oBTC - "0xF5194c3325202F456c95c1Cf0cA36f8475C1949F", # IronBank - "0xFD4D8a17df4C27c1dD245d153ccf4499e806C87D", # Link - "0xd7d147c6Bb90A718c3De8C0568F9B560C79fa416", # pBTC - "0x462253b8F74B72304c145DB0e4Eebd326B22ca39", # sAAVE - "0x3C0FFFF15EA30C35d7A85B85c0782D6c94e1d238", # sETH - "0x182B723a58739a9c974cFDB385ceaDb237453c28", # stETH - "0x055be5DDB7A925BfEF3417FC157f53CA77cA7222", # USDP - "0x3B7020743Bc2A4ca9EaF9D0722d42E20d6935855", # UST - "0x8101E6760130be2C8Ace79643AB73500571b7162", # Yv2 - ], - ), - ClassifierSpec( - abi_name="LiquidityGaugeV3", - protocol=Protocol.curve, - valid_contract_addresses=[ - "0x9582C4ADACB3BCE56Fea3e590F05c3ca2fb9C477", # alUSD - "0x824F13f1a2F29cFEEa81154b46C0fc820677A637", # rETH - "0x6955a55416a06839309018A8B0cB72c4DDC11f15", # TriCrypto - ], - ), - ClassifierSpec( - abi_name="LiquidityGaugeReward", - protocol=Protocol.curve, - valid_contract_addresses=[ - "0xAEA6c312f4b3E04D752946d329693F7293bC2e6D", # DUSD - "0x5f626c30EC1215f4EdCc9982265E8b1F411D1352", # MUSD - "0x4dC4A289a8E33600D8bD4cf5F6313E43a37adec7", # RSV - "0x705350c4BcD35c9441419DdD5d2f097d7a55410F", # sBTC - "0xA90996896660DEcC6E997655E065b23788857849", # sUSDv2 - "0x6828bcF74279eE32f2723eC536c22c51Eed383C6", # tBTC - ], - ), -] -""" - CURVE_CLASSIFIER_SPECS = [*CURVE_BASE_POOLS, *CURVE_META_POOLS] From e3b360ec39da66f91f417b12a5e090c5efd9e08a Mon Sep 17 00:00:00 2001 From: Luke Van Seters Date: Tue, 12 Oct 2021 12:23:47 -0400 Subject: [PATCH 3/3] Fix swap tests --- tests/test_swaps.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_swaps.py b/tests/test_swaps.py index a2a0d29..0f62a98 100644 --- a/tests/test_swaps.py +++ b/tests/test_swaps.py @@ -185,7 +185,7 @@ def test_swaps( assert bal_v1_swap.transaction_hash == third_transaction_hash assert bal_v1_swap.block_number == block_number assert bal_v1_swap.trace_address == [6] - assert bal_v1_swap.protocol is None + assert bal_v1_swap.protocol == Protocol.balancer_v1 assert bal_v1_swap.pool_address == third_pool_address assert bal_v1_swap.from_address == bob_address assert bal_v1_swap.to_address == bob_address