From 771df11093bcf53ee8621db4bc1ff0bd386901bb Mon Sep 17 00:00:00 2001 From: Guilherme Peyrelongue Heise Date: Tue, 10 Aug 2021 12:11:11 -0400 Subject: [PATCH] adjusted profit calculation --- liquidation_inspector.py | 158 ++++++++++++--------- mev_inspect/strat/__init__.py | 0 mev_inspect/strat/liquidation_inspector.py | 61 -------- 3 files changed, 93 insertions(+), 126 deletions(-) delete mode 100644 mev_inspect/strat/__init__.py delete mode 100644 mev_inspect/strat/liquidation_inspector.py diff --git a/liquidation_inspector.py b/liquidation_inspector.py index 4e7ac1b..d1f1ca7 100644 --- a/liquidation_inspector.py +++ b/liquidation_inspector.py @@ -10,13 +10,14 @@ from mev_inspect import block # External Libraries import json +import pandas as pd from typing import Optional from web3 import Web3 from typing import List, Optional # TODO: adjust profit to new model -# unit test -# coinbase check / collateral source +# unit test +# coinbase check / collateral source # # # Block inspect @@ -25,83 +26,110 @@ from typing import List, Optional # # -all_traces = [] +liquidations = [] result = [] + +# Protocol contract address must be in included, below is AaveLendingPoolCoreV1 addrs = ['0x3dfd23A6c5E8BbcFc9581d2E864a68feb6a076d3'] -transfers = [] +from_doubles = [] +transfers_to = [] +transfers_from = [] # Inspect list of classified traces and identify liquidation -def liquidations(traces: List[ClassifiedTrace]): - event = [] - # For each trace - for k in range(len(traces)): - trace = traces[k] +def find_liquidations(traces: List[ClassifiedTrace]): + tx = [] - # Check for liquidation and register trace and unique liquidator - if trace.classification == Classification.liquidate: + # For each trace + for count, trace in enumerate(traces): - all_traces.append(trace) - liquidator = trace.from_address - if liquidator not in addrs: addrs.append(liquidator) - print(f"\nLiquidation found: \n\t{liquidator}") - print(f"\nHash: \n\t{trace.transaction_hash}\n") + # Check for liquidation and register trace and unique liquidator + if ( + trace.classification == Classification.liquidate and + trace.transaction_hash not in tx + ): - # Found liquidation, now parse inputs for data - for i in trace.inputs: + liquidations.append(trace) + addrs.append(trace.from_address) + tx.append(trace.transaction_hash) + print(f"\nLiquidation found: \n\t{trace.from_address}") + print(f"\nHash: \n\t{trace.transaction_hash}\n") + print(f"\nGas Used: {trace.gas_used}\n") - if(i == '_purchaseAmount'): - liquidation_amount = trace.inputs[i] - elif (i == '_collateral'): - collateral_type = trace.inputs[i] - elif (i == '_reserve'): - reserve = trace.inputs[i] - elif(i == '_user'): - liquidated_usr = trace.inputs[i] + # Found liquidation, now parse inputs for data + for i in trace.inputs: - # Register liquidation - result.append( - Liquidation(collateral_type=collateral_type, - collateral_amount=liquidation_amount, - collateral_source="", - reserve=reserve, - strategy=StrategyType.liquidation, - traces=all_traces, - protocols=[trace.protocol],) - ) + if(i == '_purchaseAmount'): + liquidation_amount = trace.inputs[i] + elif (i == '_collateral'): + collateral_type = trace.inputs[i] + print(f"Collateral type: {collateral_type}") + #This will be the address of the sent token + elif (i == '_reserve'): + reserve = trace.inputs[i] + print(f"Reserve: {reserve}") + #This will be the address of the received token + elif(i == '_user'): + liquidated_usr = trace.inputs[i] + # Register liquidation + result.append( + Liquidation(collateral_type=collateral_type, + collateral_amount=liquidation_amount, + collateral_source="", + reserve=reserve, + strategy=StrategyType.liquidation, + traces=liquidations, + protocols=[trace.protocol],) + ) - # Check for transfer from a registered liquidator - elif ( - trace.classification == Classification.transfer and - 'sender' in trace.inputs and - trace.inputs['sender'] in addrs - ): + # Check for transfer from a registered liquidator + elif ( + trace.classification == Classification.transfer and + 'sender' in trace.inputs and + trace.inputs['sender'] in addrs and + trace.transaction_hash not in from_doubles + ): - liquidator = next(addrs[i] for i in range(len(addrs)) if trace.inputs['sender'] == addrs[i]) - transfers.append(trace) + liquidator = next(addrs[i] for i in range(len(addrs)) if trace.inputs['sender'] == addrs[i]) + transfers_from.append(["from", liquidator, trace.transaction_hash, trace.inputs['amount']]) + from_doubles.append(trace.transaction_hash) - print(f""" - \nTransfer from liquidator {liquidator}: - \n\tAmount in received token: {trace.inputs['amount']} to - \n\t{trace.inputs['recipient']} - \n\tTransaction: {trace.transaction_hash}\n - """) + print(f""" + \nTransfer from liquidator {liquidator}: + \n\tAmount sent: {trace.inputs['amount']} to + \n\t{trace.inputs['recipient']} + \n\tTransaction: {trace.transaction_hash}\n + """) - # Check for transfer to a registered liquidator - elif ( - trace.classification == Classification.transfer and - trace.inputs['recipient'] in addrs - ): + # Check for transfer to a registered liquidator + elif ( + trace.classification == Classification.transfer and + trace.inputs['recipient'] in addrs + ): - liquidator = next(addrs[i] for i in range(len(addrs)) if trace.inputs['recipient'] == addrs[i]) - transfers.append(trace) + liquidator = next(addrs[i] for i in range(len(addrs)) if trace.inputs['recipient'] == addrs[i]) + transfers_to.append(["to", liquidator, trace.transaction_hash, trace.inputs['amount']]) - print(f""" - \nTransfer to liquidator {liquidator}: - \n\tAmount in received token: {trace.inputs['amount']} from - \n\t{trace.from_address} - \n\tTransaction: {trace.transaction_hash}\n - """) + print(f""" + \nTransfer to liquidator {liquidator}: + \n\tAmount in received token: {trace.inputs['amount']} from + \n\t{trace.from_address} + \n\tTransaction: {trace.transaction_hash}\n + """) - return result + for count, trace in enumerate(liquidations): + tx = trace.transaction_hash + #convert token to ETH + #profit = transfers[count][2] - transfers[count+1][2] + + + profits = [] + for count, trace in enumerate(transfers_to): + profits.append({"liquidator" : transfers_to[count][1], + "transaction" : transfers_to[count][2], + "profit" : transfers_to[count][3] - transfers_from[count][3]}) + + print(profits) + print(liquidations) + return result rpc = 'http://162.55.96.141:8546/' @@ -110,4 +138,4 @@ base_provider = Web3.HTTPProvider(rpc) block_data = block.create_from_block_number(block_number, base_provider) trace_clasifier = TraceClassifier(CLASSIFIER_SPECS) classified_traces = trace_clasifier.classify(block_data.traces) -fin = liquidations(classified_traces) +fin = find_liquidations(classified_traces) diff --git a/mev_inspect/strat/__init__.py b/mev_inspect/strat/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/mev_inspect/strat/liquidation_inspector.py b/mev_inspect/strat/liquidation_inspector.py deleted file mode 100644 index 4a32a06..0000000 --- a/mev_inspect/strat/liquidation_inspector.py +++ /dev/null @@ -1,61 +0,0 @@ -import json -from typing import Optional - -from web3 import Web3 - -from typing import List, Optional - -from mev_inspect import utils -from mev_inspect.config import load_config -from mev_inspect.schemas.blocks import NestedTrace, TraceType -from mev_inspect.schemas.classifications import Classification -from mev_inspect.schemas.strategy import Strategy, Liquidation - -from .base import StrategyInspector - -class LiquidationInspector(StrategyInspector): - - def __init__(self): - self.result = [] - - # Inspect list of classified traces and identify liquidation - def inspect(self, traces): - - event = [] - - # For each trace - for i in range(1, len(traces)): - trace = traces[i] - - # Liquidation condition - if trace.classification == Classification.liquidate: - - # Collateral data from the liquidation. - # The inputs will differ by DEX, this is AAVE - - for i in trace.inputs: - if( i["name"] == '_purchaseAmount'): - value = trace.inputs[i] - elif (i["name"] == '_collateral'): - collateral_type = trace.inputs[i] - elif (i["name"] == '_reserve'): - collateral_source = trace.inputs[i] - - - # Define the address of the liquidator - liquidator = trace.from_address - - # Find a transfer before liquidation with a to_address corresponding to the liquidator - for trace in traces[:i]: - if (trace.classification == Classification.transfer & trace.to_address == liquidator): - profit = - #Calculate profit - - - # Tag liquidation - event.append(Strategy(strategy=StategyType.liquidation, - traces=[trace], - protocols=[trace.protocol])) - - - return result