Compare commits

...

26 Commits

Author SHA1 Message Date
Taarush Vemulapalli
a5912a3de1 fix cream test 2021-12-16 13:05:51 -05:00
Taarush Vemulapalli
4dd1337c21 add received_token_address 2021-12-16 13:02:13 -05:00
Luke Van Seters
5fa7c6b567 Merge pull request #167 from flashbots/isort-again
Fix whitespace for isort
2021-12-14 13:31:50 -05:00
Luke Van Seters
b9544eb18b Fix whitespace for isort 2021-12-14 13:14:13 -05:00
Luke Van Seters
c23b9a1651 Merge pull request #158 from flashbots/add-isort
Add isort pack to pre-commit
2021-12-14 13:11:39 -05:00
Luke Van Seters
94a05d8845 Run isort for alembic 2021-12-14 13:09:28 -05:00
Luke Van Seters
8b6bf7d76d Make alembic a known third part for isort 2021-12-14 13:09:02 -05:00
Luke Van Seters
2c251fb72e Make alembic a known third party 2021-12-14 13:08:26 -05:00
Luke Van Seters
bda96b04ce Try local rev 2021-12-14 13:03:24 -05:00
Luke Van Seters
bd73820123 Rename isort back 2021-12-14 12:59:14 -05:00
Luke Van Seters
7bc820fb33 Merge pull request #162 from flashbots/add-sandwiches-db
Add sandwiches tables
2021-12-14 12:48:03 -05:00
Luke Van Seters
4b909ad88e Add tables for sandwiches 2021-12-14 12:47:49 -05:00
Luke Van Seters
2ec2bf44ba Merge pull request #160 from flashbots/add-transaction-position-crud
Write transaction position for swaps and traces
2021-12-14 12:47:16 -05:00
Luke Van Seters
ccd409e9cf Merge pull request #161 from flashbots/add-transaction-position
Add nullable transaction position field
2021-12-14 12:47:07 -05:00
Luke Van Seters
138b1a0eef No comments 2021-12-14 12:46:00 -05:00
Luke Van Seters
d62d547da1 Merge pull request #159 from flashbots/faster-tests
Speed up the tests by sharing trace_classifier
2021-12-14 12:37:02 -05:00
Luke Van Seters
9ffe9fe131 Add back 2021-12-13 20:24:29 -05:00
Luke Van Seters
c6eba733a0 Fix env.py 2021-12-13 20:20:12 -05:00
Luke Van Seters
c853cee43e Write transaction position for swaps and traces 2021-12-13 20:05:07 -05:00
Luke Van Seters
e84d946ebb Add nullable transaction position field 2021-12-13 20:03:17 -05:00
Luke Van Seters
2046cd2e51 Add support for profiling 2021-12-13 19:46:58 -05:00
Luke Van Seters
bb23fce13c Share trace classifier in tests 2021-12-13 19:34:47 -05:00
Luke Van Seters
5d7d84aa02 Add back isort in precommit 2021-12-13 18:50:43 -05:00
Luke Van Seters
767cf2df8f Specify python version 2021-12-13 18:48:50 -05:00
Luke Van Seters
d5f73b5e3a Run isort on all files 2021-12-13 18:46:39 -05:00
Luke Van Seters
bc46c2929b Fix isort settings so mev_inspect is considered this project 2021-12-13 18:45:21 -05:00
87 changed files with 328 additions and 304 deletions

View File

@@ -2,8 +2,15 @@ repos:
- repo: https://github.com/ambv/black
rev: 20.8b1
hooks:
- id: black
language_version: python3.9
- id: black
language_version: python3.9
- repo: local
hooks:
- id: isort
name: isort
entry: poetry run isort .
language: system
types: [python]
- repo: local
hooks:
- id: pylint

View File

@@ -433,7 +433,7 @@ int-import-graph=
known-standard-library=
# Force import order to recognize a module as part of a third party library.
known-third-party=enchant
known-third-party=alembic
# Couples of modules and preferred modules, separated by a comma.
preferred-modules=

View File

@@ -1,9 +1,7 @@
from logging.config import fileConfig
from sqlalchemy import engine_from_config
from sqlalchemy import pool
from alembic import context
from sqlalchemy import engine_from_config, pool
from mev_inspect.db import get_inspect_database_uri

View File

@@ -7,7 +7,6 @@ Create Date: 2021-11-02 22:42:01.702538
"""
from alembic import op
# revision identifiers, used by Alembic.
revision = "04a3bb3740c3"
down_revision = "a10d68643476"

View File

@@ -8,7 +8,6 @@ Create Date: 2021-11-26 15:31:21.111693
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "04b76ab1d2af"
down_revision = "0cef835f7b36"

View File

@@ -8,7 +8,6 @@ Create Date: 2021-11-26 18:25:13.402822
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "d498bdb0a641"
down_revision = "b9fa1ecc9929"

View File

@@ -8,7 +8,6 @@ Create Date: 2021-08-30 17:42:25.548130
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "083978d6e455"
down_revision = "92f28a2b4f52"

View File

@@ -7,7 +7,6 @@ Create Date: 2021-11-19 15:36:15.152622
"""
from alembic import op
# revision identifiers, used by Alembic.
revision = "0cef835f7b36"
down_revision = "5427d62a2cc0"

View File

@@ -0,0 +1,28 @@
"""Add nullable transaction_position field to swaps and traces
Revision ID: 15ba9c27ee8a
Revises: 04b76ab1d2af
Create Date: 2021-12-02 18:24:18.218880
"""
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "15ba9c27ee8a"
down_revision = "ead7eb8283b9"
branch_labels = None
depends_on = None
def upgrade():
op.add_column(
"classified_traces",
sa.Column("transaction_position", sa.Numeric, nullable=True),
)
op.add_column("swaps", sa.Column("transaction_position", sa.Numeric, nullable=True))
def downgrade():
op.drop_column("classified_traces", "transaction_position")
op.drop_column("swaps", "transaction_position")

View File

@@ -8,7 +8,6 @@ Create Date: 2021-10-04 19:52:40.017084
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "205ce02374b3"
down_revision = "c8363617aa07"

View File

@@ -8,7 +8,6 @@ Create Date: 2021-11-17 18:29:13.065944
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "2c90b2b8a80b"
down_revision = "04a3bb3740c3"

View File

@@ -7,7 +7,6 @@ Create Date: 2021-09-14 11:11:41.559137
"""
from alembic import op
# revision identifiers, used by Alembic.
revision = "320e56b0a99f"
down_revision = "a02f3f2c469f"

View File

@@ -7,7 +7,6 @@ Create Date: 2021-11-02 20:50:32.854996
"""
from alembic import op
# revision identifiers, used by Alembic.
revision = "3417f49d97b3"
down_revision = "205ce02374b3"

View File

@@ -8,7 +8,6 @@ Create Date: 2021-11-26 20:35:58.954138
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "52d75a7e0533"
down_revision = "7cf0eeb41da0"

View File

@@ -8,7 +8,6 @@ Create Date: 2021-11-19 13:25:11.252774
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "5427d62a2cc0"
down_revision = "d540242ae368"

View File

@@ -8,7 +8,6 @@ Create Date: 2021-11-26 20:27:28.936516
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "7cf0eeb41da0"
down_revision = "d498bdb0a641"

View File

@@ -8,7 +8,6 @@ Create Date: 2021-08-06 15:58:04.556762
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "7eec417a4f3e"
down_revision = "9d8c69b3dccb"

View File

@@ -8,7 +8,6 @@ Create Date: 2021-08-17 03:46:21.498821
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "92f28a2b4f52"
down_revision = "9b8ae51c5d56"

View File

@@ -8,7 +8,6 @@ Create Date: 2021-08-06 17:06:55.364516
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "9b8ae51c5d56"
down_revision = "7eec417a4f3e"

View File

@@ -8,7 +8,6 @@ Create Date: 2021-08-05 21:46:35.209199
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "9d8c69b3dccb"
down_revision = "2116e2f36a19"

View File

@@ -8,7 +8,6 @@ Create Date: 2021-09-13 21:32:27.181344
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "a02f3f2c469f"
down_revision = "d70c08b4db6f"

View File

@@ -7,7 +7,6 @@ Create Date: 2021-11-02 22:03:26.312317
"""
from alembic import op
# revision identifiers, used by Alembic.
revision = "a10d68643476"
down_revision = "3417f49d97b3"

View File

@@ -8,7 +8,6 @@ Create Date: 2021-12-01 23:32:40.574108
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "b9fa1ecc9929"
down_revision = "04b76ab1d2af"

View File

@@ -7,7 +7,6 @@ Create Date: 2021-07-30 17:37:27.335475
"""
from alembic import op
# revision identifiers, used by Alembic.
revision = "c5da44eb072c"
down_revision = "0660432b9840"

View File

@@ -8,7 +8,6 @@ Create Date: 2021-09-29 14:00:06.857103
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "c8363617aa07"
down_revision = "cd96af55108e"

View File

@@ -8,7 +8,6 @@ Create Date: 2021-09-17 12:44:45.245137
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "cd96af55108e"
down_revision = "320e56b0a99f"

View File

@@ -8,7 +8,6 @@ Create Date: 2021-11-18 04:30:06.802857
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "d540242ae368"
down_revision = "2c90b2b8a80b"

View File

@@ -8,7 +8,6 @@ Create Date: 2021-08-30 22:10:04.186251
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "d70c08b4db6f"
down_revision = "083978d6e455"

View File

@@ -0,0 +1,69 @@
"""Create sandwiches and sandwiched swaps tables
Revision ID: ead7eb8283b9
Revises: a5d80460f0e6
Create Date: 2021-12-03 16:37:28.077158
"""
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "ead7eb8283b9"
down_revision = "52d75a7e0533"
branch_labels = None
depends_on = None
def upgrade():
op.create_table(
"sandwiches",
sa.Column("id", sa.String(256), primary_key=True),
sa.Column("created_at", sa.TIMESTAMP, server_default=sa.func.now()),
sa.Column("block_number", sa.Numeric, nullable=False),
sa.Column("sandwicher_address", sa.String(256), nullable=False),
sa.Column("frontrun_swap_transaction_hash", sa.String(256), nullable=False),
sa.Column("frontrun_swap_trace_address", sa.ARRAY(sa.Integer), nullable=False),
sa.Column("backrun_swap_transaction_hash", sa.String(256), nullable=False),
sa.Column("backrun_swap_trace_address", sa.ARRAY(sa.Integer), nullable=False),
)
op.create_index(
"ik_sandwiches_frontrun",
"sandwiches",
[
"block_number",
"frontrun_swap_transaction_hash",
"frontrun_swap_trace_address",
],
)
op.create_index(
"ik_sandwiches_backrun",
"sandwiches",
["block_number", "backrun_swap_transaction_hash", "backrun_swap_trace_address"],
)
op.create_table(
"sandwiched_swaps",
sa.Column("created_at", sa.TIMESTAMP, server_default=sa.func.now()),
sa.Column("sandwich_id", sa.String(1024), primary_key=True),
sa.Column("block_number", sa.Numeric, primary_key=True),
sa.Column("transaction_hash", sa.String(66), primary_key=True),
sa.Column("trace_address", sa.ARRAY(sa.Integer), primary_key=True),
sa.ForeignKeyConstraint(["sandwich_id"], ["sandwiches.id"], ondelete="CASCADE"),
)
op.create_index(
"ik_sandwiched_swaps_secondary",
"sandwiched_swaps",
["block_number", "transaction_hash", "trace_address"],
)
def downgrade():
op.drop_index("ik_sandwiched_swaps_secondary")
op.drop_table("sandwiched_swaps")
op.drop_index("ik_sandwiches_frontrun")
op.drop_index("ik_sandwiches_backrun")
op.drop_table("sandwiches")

View File

@@ -15,7 +15,6 @@ from mev_inspect.inspector import MEVInspector
from mev_inspect.provider import get_base_provider
from mev_inspect.signal_handler import GracefulKiller
logging.basicConfig(filename="listener.log", filemode="a", level=logging.INFO)
logger = logging.getLogger(__name__)

View File

@@ -3,7 +3,6 @@ import time
from mev_inspect.signal_handler import GracefulKiller
logging.basicConfig(filename="loop.log", level=logging.INFO)
logger = logging.getLogger(__name__)

3
mev
View File

@@ -48,8 +48,9 @@ case "$1" in
poetry run inspect-many-blocks $start_block_number $end_block_number
;;
test)
shift
echo "Running tests"
kubectl exec -ti deploy/mev-inspect -- poetry run pytest tests
kubectl exec -ti deploy/mev-inspect -- poetry run pytest tests $@
;;
fetch)
block_number=$2

View File

@@ -1,21 +1,16 @@
from typing import List, Tuple, Optional
from typing import List, Optional, Tuple
from mev_inspect.traces import (
get_child_traces,
is_child_of_any_address,
)
from mev_inspect.schemas.liquidations import Liquidation
from mev_inspect.schemas.traces import (
ClassifiedTrace,
CallTrace,
DecodedCallTrace,
Classification,
ClassifiedTrace,
DecodedCallTrace,
Protocol,
)
from mev_inspect.transfers import get_transfer
from mev_inspect.schemas.transfers import Transfer
from mev_inspect.schemas.liquidations import Liquidation
from mev_inspect.traces import get_child_traces, is_child_of_any_address
from mev_inspect.transfers import get_transfer
AAVE_CONTRACT_ADDRESSES: List[str] = [
# AAVE Proxy

View File

@@ -7,7 +7,6 @@ from pydantic import parse_obj_as
from mev_inspect.schemas.abi import ABI
from mev_inspect.schemas.traces import Protocol
THIS_FILE_DIRECTORY = Path(__file__).parents[0]
ABI_DIRECTORY_PATH = THIS_FILE_DIRECTORY / "abis"

View File

@@ -11,7 +11,6 @@ from mev_inspect.schemas.receipts import Receipt
from mev_inspect.schemas.traces import Trace, TraceType
from mev_inspect.utils import hex_to_int
logger = logging.getLogger(__name__)

View File

@@ -1,9 +1,8 @@
from typing import Optional, List, Sequence
from typing import List, Optional, Sequence
from mev_inspect.schemas.swaps import Swap
from mev_inspect.schemas.transfers import Transfer, ETH_TOKEN_ADDRESS
from mev_inspect.schemas.traces import DecodedCallTrace, ClassifiedTrace
from mev_inspect.schemas.traces import ClassifiedTrace, DecodedCallTrace
from mev_inspect.schemas.transfers import ETH_TOKEN_ADDRESS, Transfer
def create_swap_from_pool_transfers(
@@ -41,6 +40,7 @@ def create_swap_from_pool_transfers(
return Swap(
abi_name=trace.abi_name,
transaction_hash=trace.transaction_hash,
transaction_position=trace.transaction_position,
block_number=trace.block_number,
trace_address=trace.trace_address,
contract_address=pool_address,
@@ -78,6 +78,7 @@ def create_swap_from_recipient_transfers(
return Swap(
abi_name=trace.abi_name,
transaction_hash=trace.transaction_hash,
transaction_position=trace.transaction_position,
block_number=trace.block_number,
trace_address=trace.trace_address,
contract_address=pool_address,

View File

@@ -1,18 +1,18 @@
from typing import Dict, Optional, Tuple, Type
from mev_inspect.schemas.classifiers import Classifier, ClassifierSpec
from mev_inspect.schemas.traces import DecodedCallTrace, Protocol
from mev_inspect.schemas.classifiers import ClassifierSpec, Classifier
from .aave import AAVE_CLASSIFIER_SPECS
from .balancer import BALANCER_CLASSIFIER_SPECS
from .bancor import BANCOR_CLASSIFIER_SPECS
from .compound import COMPOUND_CLASSIFIER_SPECS
from .cryptopunks import CRYPTOPUNKS_CLASSIFIER_SPECS
from .curve import CURVE_CLASSIFIER_SPECS
from .erc20 import ERC20_CLASSIFIER_SPECS
from .uniswap import UNISWAP_CLASSIFIER_SPECS
from .weth import WETH_CLASSIFIER_SPECS, WETH_ADDRESS
from .weth import WETH_ADDRESS, WETH_CLASSIFIER_SPECS
from .zero_ex import ZEROX_CLASSIFIER_SPECS
from .balancer import BALANCER_CLASSIFIER_SPECS
from .compound import COMPOUND_CLASSIFIER_SPECS
from .cryptopunks import CRYPTOPUNKS_CLASSIFIER_SPECS
from .bancor import BANCOR_CLASSIFIER_SPECS
ALL_CLASSIFIER_SPECS = (
ERC20_CLASSIFIER_SPECS

View File

@@ -1,8 +1,8 @@
from mev_inspect.schemas.classifiers import (
ClassifierSpec,
DecodedCallTrace,
TransferClassifier,
LiquidationClassifier,
TransferClassifier,
)
from mev_inspect.schemas.traces import Protocol
from mev_inspect.schemas.transfers import Transfer

View File

@@ -1,15 +1,10 @@
from typing import Optional, List
from mev_inspect.schemas.transfers import Transfer
from mev_inspect.schemas.swaps import Swap
from mev_inspect.schemas.traces import (
DecodedCallTrace,
Protocol,
)
from mev_inspect.schemas.classifiers import (
ClassifierSpec,
SwapClassifier,
)
from typing import List, Optional
from mev_inspect.classifiers.helpers import create_swap_from_pool_transfers
from mev_inspect.schemas.classifiers import ClassifierSpec, SwapClassifier
from mev_inspect.schemas.swaps import Swap
from mev_inspect.schemas.traces import DecodedCallTrace, Protocol
from mev_inspect.schemas.transfers import Transfer
BALANCER_V1_POOL_ABI_NAME = "BPool"

View File

@@ -1,17 +1,10 @@
from typing import Optional, List
from mev_inspect.schemas.transfers import Transfer
from typing import List, Optional
from mev_inspect.classifiers.helpers import create_swap_from_recipient_transfers
from mev_inspect.schemas.classifiers import ClassifierSpec, SwapClassifier
from mev_inspect.schemas.swaps import Swap
from mev_inspect.schemas.traces import (
DecodedCallTrace,
Protocol,
)
from mev_inspect.schemas.classifiers import (
ClassifierSpec,
SwapClassifier,
)
from mev_inspect.classifiers.helpers import (
create_swap_from_recipient_transfers,
)
from mev_inspect.schemas.traces import DecodedCallTrace, Protocol
from mev_inspect.schemas.transfers import Transfer
BANCOR_NETWORK_ABI_NAME = "BancorNetwork"
BANCOR_NETWORK_CONTRACT_ADDRESS = "0x2F9EC37d6CcFFf1caB21733BdaDEdE11c823cCB0"

View File

@@ -1,11 +1,9 @@
from mev_inspect.schemas.traces import (
Protocol,
)
from mev_inspect.schemas.classifiers import (
ClassifierSpec,
LiquidationClassifier,
SeizeClassifier,
)
from mev_inspect.schemas.traces import Protocol
COMPOUND_V2_CETH_SPEC = ClassifierSpec(
abi_name="CEther",

View File

@@ -1,9 +1,5 @@
from mev_inspect.schemas.traces import Protocol, Classification
from mev_inspect.schemas.classifiers import (
ClassifierSpec,
Classifier,
)
from mev_inspect.schemas.classifiers import Classifier, ClassifierSpec
from mev_inspect.schemas.traces import Classification, Protocol
class PunkBidAcceptanceClassifier(Classifier):

View File

@@ -1,16 +1,10 @@
from typing import Optional, List
from mev_inspect.schemas.transfers import Transfer
from mev_inspect.schemas.swaps import Swap
from mev_inspect.schemas.traces import (
Protocol,
DecodedCallTrace,
)
from typing import List, Optional
from mev_inspect.schemas.classifiers import (
ClassifierSpec,
SwapClassifier,
)
from mev_inspect.classifiers.helpers import create_swap_from_pool_transfers
from mev_inspect.schemas.classifiers import ClassifierSpec, SwapClassifier
from mev_inspect.schemas.swaps import Swap
from mev_inspect.schemas.traces import DecodedCallTrace, Protocol
from mev_inspect.schemas.transfers import Transfer
class CurveSwapClassifier(SwapClassifier):

View File

@@ -1,8 +1,5 @@
from mev_inspect.schemas.classifiers import ClassifierSpec, TransferClassifier
from mev_inspect.schemas.traces import DecodedCallTrace
from mev_inspect.schemas.classifiers import (
ClassifierSpec,
TransferClassifier,
)
from mev_inspect.schemas.transfers import Transfer

View File

@@ -1,16 +1,10 @@
from typing import Optional, List
from mev_inspect.schemas.transfers import Transfer
from mev_inspect.schemas.swaps import Swap
from mev_inspect.schemas.traces import (
DecodedCallTrace,
Protocol,
)
from mev_inspect.schemas.classifiers import (
ClassifierSpec,
SwapClassifier,
)
from mev_inspect.classifiers.helpers import create_swap_from_pool_transfers
from typing import List, Optional
from mev_inspect.classifiers.helpers import create_swap_from_pool_transfers
from mev_inspect.schemas.classifiers import ClassifierSpec, SwapClassifier
from mev_inspect.schemas.swaps import Swap
from mev_inspect.schemas.traces import DecodedCallTrace, Protocol
from mev_inspect.schemas.transfers import Transfer
UNISWAP_V2_PAIR_ABI_NAME = "UniswapV2Pair"
UNISWAP_V3_POOL_ABI_NAME = "UniswapV3Pool"

View File

@@ -1,11 +1,9 @@
from mev_inspect.schemas.traces import (
Protocol,
)
from mev_inspect.schemas.classifiers import (
ClassifierSpec,
DecodedCallTrace,
TransferClassifier,
)
from mev_inspect.schemas.traces import Protocol
from mev_inspect.schemas.transfers import Transfer

View File

@@ -1,14 +1,9 @@
from typing import Optional, List, Tuple
from mev_inspect.schemas.transfers import Transfer
from typing import List, Optional, Tuple
from mev_inspect.schemas.classifiers import ClassifierSpec, SwapClassifier
from mev_inspect.schemas.swaps import Swap
from mev_inspect.schemas.traces import (
DecodedCallTrace,
Protocol,
)
from mev_inspect.schemas.classifiers import (
ClassifierSpec,
SwapClassifier,
)
from mev_inspect.schemas.traces import DecodedCallTrace, Protocol
from mev_inspect.schemas.transfers import Transfer
ANY_TAKER_ADDRESS = "0x0000000000000000000000000000000000000000"
@@ -40,6 +35,7 @@ class ZeroExSwapClassifier(SwapClassifier):
return Swap(
abi_name=trace.abi_name,
transaction_hash=trace.transaction_hash,
transaction_position=trace.transaction_position,
block_number=trace.block_number,
trace_address=trace.trace_address,
contract_address=trace.to_address,

View File

@@ -4,12 +4,13 @@ from mev_inspect.abi import get_abi
from mev_inspect.decode import ABIDecoder
from mev_inspect.schemas.blocks import CallAction, CallResult
from mev_inspect.schemas.traces import (
CallTrace,
Classification,
ClassifiedTrace,
CallTrace,
DecodedCallTrace,
Trace,
TraceType,
)
from mev_inspect.schemas.traces import Trace, TraceType
from .specs import ALL_CLASSIFIER_SPECS

View File

@@ -1,17 +1,17 @@
import aiohttp
from mev_inspect.classifiers.specs.weth import WETH_ADDRESS
from mev_inspect.schemas.transfers import ETH_TOKEN_ADDRESS
from mev_inspect.schemas.coinbase import CoinbasePrices, CoinbasePricesResponse
from mev_inspect.schemas.prices import (
WBTC_TOKEN_ADDRESS,
LINK_TOKEN_ADDRESS,
YEARN_TOKEN_ADDRESS,
AAVE_TOKEN_ADDRESS,
LINK_TOKEN_ADDRESS,
REN_TOKEN_ADDRESS,
UNI_TOKEN_ADDRESS,
USDC_TOKEN_ADDRESS_ADDRESS,
REN_TOKEN_ADDRESS,
WBTC_TOKEN_ADDRESS,
YEARN_TOKEN_ADDRESS,
)
from mev_inspect.schemas.transfers import ETH_TOKEN_ADDRESS
COINBASE_API_BASE = "https://www.coinbase.com/api/v2"
COINBASE_TOKEN_NAME_BY_ADDRESS = {

View File

@@ -1,13 +1,8 @@
from typing import List, Optional
from mev_inspect.traces import get_child_traces
from mev_inspect.schemas.traces import (
ClassifiedTrace,
Classification,
Protocol,
)
from mev_inspect.schemas.liquidations import Liquidation
from mev_inspect.schemas.traces import Classification, ClassifiedTrace, Protocol
from mev_inspect.traces import get_child_traces
V2_COMPTROLLER_ADDRESS = "0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B"
V2_C_ETHER = "0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5"
@@ -49,6 +44,7 @@ def get_compound_liquidations(
debt_purchase_amount=trace.value,
protocol=trace.protocol,
received_amount=seize_trace.inputs["seizeTokens"],
received_token_address=trace.to_address,
transaction_hash=trace.transaction_hash,
trace_address=trace.trace_address,
block_number=trace.block_number,
@@ -65,6 +61,7 @@ def get_compound_liquidations(
debt_purchase_amount=trace.inputs["repayAmount"],
protocol=trace.protocol,
received_amount=seize_trace.inputs["seizeTokens"],
received_token_address=trace.to_address,
transaction_hash=trace.transaction_hash,
trace_address=trace.trace_address,
block_number=trace.block_number,

View File

@@ -2,13 +2,13 @@ import json
from typing import List
from mev_inspect.models.punks import (
PunkSnipeModel,
PunkBidModel,
PunkBidAcceptanceModel,
PunkBidModel,
PunkSnipeModel,
)
from mev_inspect.schemas.punk_snipe import PunkSnipe
from mev_inspect.schemas.punk_bid import PunkBid
from mev_inspect.schemas.punk_accept_bid import PunkBidAcceptance
from mev_inspect.schemas.punk_bid import PunkBid
from mev_inspect.schemas.punk_snipe import PunkSnipe
def delete_punk_bid_acceptances_for_block(

View File

@@ -28,6 +28,7 @@ def write_classified_traces(
models.append(
ClassifiedTraceModel(
transaction_hash=trace.transaction_hash,
transaction_position=trace.transaction_position,
block_number=trace.block_number,
classification=trace.classification.value,
trace_type=trace.type.value,

View File

@@ -1,7 +1,6 @@
from typing import Dict, Optional
import eth_utils.abi
from eth_abi import decode_abi
from eth_abi.exceptions import InsufficientDataBytes, NonEmptyPaddingBytes
from hexbytes._utils import hexstr_to_bytes
@@ -9,7 +8,6 @@ from hexbytes._utils import hexstr_to_bytes
from mev_inspect.schemas.abi import ABI, ABIFunctionDescription
from mev_inspect.schemas.call_data import CallData
# 0x + 8 characters
SELECTOR_LENGTH = 10

View File

@@ -7,45 +7,35 @@ from web3 import Web3
from mev_inspect.arbitrages import get_arbitrages
from mev_inspect.block import create_from_block_number
from mev_inspect.classifiers.trace import TraceClassifier
from mev_inspect.crud.arbitrages import (
delete_arbitrages_for_block,
write_arbitrages,
)
from mev_inspect.crud.punks import (
delete_punk_snipes_for_block,
write_punk_snipes,
delete_punk_bids_for_block,
write_punk_bids,
delete_punk_bid_acceptances_for_block,
write_punk_bid_acceptances,
)
from mev_inspect.crud.blocks import (
delete_block,
write_block,
)
from mev_inspect.crud.traces import (
delete_classified_traces_for_block,
write_classified_traces,
from mev_inspect.crud.arbitrages import delete_arbitrages_for_block, write_arbitrages
from mev_inspect.crud.blocks import delete_block, write_block
from mev_inspect.crud.liquidations import (
delete_liquidations_for_block,
write_liquidations,
)
from mev_inspect.crud.miner_payments import (
delete_miner_payments_for_block,
write_miner_payments,
)
from mev_inspect.crud.swaps import delete_swaps_for_block, write_swaps
from mev_inspect.crud.transfers import delete_transfers_for_block, write_transfers
from mev_inspect.crud.liquidations import (
delete_liquidations_for_block,
write_liquidations,
from mev_inspect.crud.punks import (
delete_punk_bid_acceptances_for_block,
delete_punk_bids_for_block,
delete_punk_snipes_for_block,
write_punk_bid_acceptances,
write_punk_bids,
write_punk_snipes,
)
from mev_inspect.crud.swaps import delete_swaps_for_block, write_swaps
from mev_inspect.crud.traces import (
delete_classified_traces_for_block,
write_classified_traces,
)
from mev_inspect.crud.transfers import delete_transfers_for_block, write_transfers
from mev_inspect.liquidations import get_liquidations
from mev_inspect.miner_payments import get_miner_payments
from mev_inspect.punks import get_punk_bid_acceptances, get_punk_bids, get_punk_snipes
from mev_inspect.swaps import get_swaps
from mev_inspect.transfers import get_transfers
from mev_inspect.liquidations import get_liquidations
logger = logging.getLogger(__name__)

View File

@@ -2,11 +2,8 @@ from typing import List
from mev_inspect.aave_liquidations import get_aave_liquidations
from mev_inspect.compound_liquidations import get_compound_liquidations
from mev_inspect.schemas.traces import (
ClassifiedTrace,
Classification,
)
from mev_inspect.schemas.liquidations import Liquidation
from mev_inspect.schemas.traces import Classification, ClassifiedTrace
def has_liquidations(classified_traces: List[ClassifiedTrace]) -> bool:

View File

@@ -1,13 +1,10 @@
from typing import List
from mev_inspect.schemas.traces import ClassifiedTrace
from mev_inspect.schemas.miner_payments import MinerPayment
from mev_inspect.schemas.receipts import Receipt
from mev_inspect.schemas.traces import ClassifiedTrace
from mev_inspect.traces import get_traces_by_transaction_hash
from mev_inspect.transfers import (
filter_transfers,
get_eth_transfers,
)
from mev_inspect.transfers import filter_transfers, get_eth_transfers
def get_miner_payments(

View File

@@ -1,4 +1,4 @@
from sqlalchemy import Column, Numeric, String, ARRAY, Integer
from sqlalchemy import ARRAY, Column, Integer, Numeric, String
from .base import Base

View File

@@ -1,4 +1,4 @@
from sqlalchemy import Column, Numeric, String, TIMESTAMP
from sqlalchemy import TIMESTAMP, Column, Numeric, String
from .base import Base

View File

@@ -1,4 +1,4 @@
from sqlalchemy import Column, Numeric, String, ARRAY, Integer
from sqlalchemy import ARRAY, Column, Integer, Numeric, String
from .base import Base

View File

@@ -1,4 +1,4 @@
from sqlalchemy import Column, Numeric, String, ARRAY, Integer
from sqlalchemy import ARRAY, Column, Integer, Numeric, String
from .base import Base

View File

@@ -1,4 +1,4 @@
from sqlalchemy import Column, Numeric, String, ARRAY, Integer
from sqlalchemy import ARRAY, Column, Integer, Numeric, String
from .base import Base
@@ -8,6 +8,7 @@ class SwapModel(Base):
abi_name = Column(String, nullable=False)
transaction_hash = Column(String, primary_key=True)
transaction_position = Column(Numeric, nullable=True)
block_number = Column(Numeric, nullable=False)
trace_address = Column(ARRAY(Integer), nullable=False)
protocol = Column(String, nullable=True)

View File

@@ -1,4 +1,4 @@
from sqlalchemy import Column, JSON, Numeric, String, ARRAY, Integer
from sqlalchemy import ARRAY, JSON, Column, Integer, Numeric, String
from .base import Base
@@ -7,6 +7,7 @@ class ClassifiedTraceModel(Base):
__tablename__ = "classified_traces"
transaction_hash = Column(String, primary_key=True)
transaction_position = Column(Numeric, nullable=True)
block_number = Column(Numeric, nullable=False)
classification = Column(String, nullable=False)
trace_type = Column(String, nullable=False)

View File

@@ -1,4 +1,4 @@
from sqlalchemy import Column, Numeric, String, ARRAY, Integer
from sqlalchemy import ARRAY, Column, Integer, Numeric, String
from .base import Base

View File

@@ -3,18 +3,17 @@ from typing import List
from mev_inspect.classifiers.specs.weth import WETH_ADDRESS
from mev_inspect.coinbase import fetch_coinbase_prices
from mev_inspect.schemas.prices import (
Price,
WBTC_TOKEN_ADDRESS,
LINK_TOKEN_ADDRESS,
YEARN_TOKEN_ADDRESS,
AAVE_TOKEN_ADDRESS,
LINK_TOKEN_ADDRESS,
REN_TOKEN_ADDRESS,
UNI_TOKEN_ADDRESS,
USDC_TOKEN_ADDRESS_ADDRESS,
REN_TOKEN_ADDRESS,
WBTC_TOKEN_ADDRESS,
YEARN_TOKEN_ADDRESS,
Price,
)
from mev_inspect.schemas.transfers import ETH_TOKEN_ADDRESS
SUPPORTED_TOKENS = [
WETH_ADDRESS,
ETH_TOKEN_ADDRESS,

View File

@@ -1,4 +1,4 @@
from web3 import Web3, AsyncHTTPProvider
from web3 import AsyncHTTPProvider, Web3
from mev_inspect.retry import http_retry_with_backoff_request_middleware

View File

@@ -1,12 +1,9 @@
from typing import List, Optional
from mev_inspect.schemas.traces import (
ClassifiedTrace,
Classification,
DecodedCallTrace,
)
from mev_inspect.schemas.punk_bid import PunkBid
from mev_inspect.schemas.punk_accept_bid import PunkBidAcceptance
from mev_inspect.schemas.punk_bid import PunkBid
from mev_inspect.schemas.punk_snipe import PunkSnipe
from mev_inspect.schemas.traces import Classification, ClassifiedTrace, DecodedCallTrace
from mev_inspect.traces import get_traces_by_transaction_hash

View File

@@ -1,34 +1,19 @@
import asyncio
import logging
import random
from typing import (
Any,
Callable,
Collection,
Type,
Coroutine,
)
from asyncio.exceptions import TimeoutError
from typing import Any, Callable, Collection, Coroutine, Type
from aiohttp.client_exceptions import (
ClientOSError,
ClientResponseError,
ServerDisconnectedError,
ServerTimeoutError,
ClientResponseError,
)
from requests.exceptions import (
ConnectionError,
HTTPError,
Timeout,
TooManyRedirects,
)
from requests.exceptions import ConnectionError, HTTPError, Timeout, TooManyRedirects
from web3 import Web3
from web3.middleware.exception_retry_request import check_if_retry_on_failure
from web3.types import (
RPCEndpoint,
RPCResponse,
)
from web3.types import RPCEndpoint, RPCResponse
request_exceptions = (ConnectionError, HTTPError, Timeout, TooManyRedirects)
aiohttp_exceptions = (

View File

@@ -1,9 +1,9 @@
from enum import Enum
from typing import List, Optional, Union
from typing_extensions import Literal
import eth_utils.abi
from pydantic import BaseModel
from typing_extensions import Literal
from web3 import Web3

View File

@@ -3,9 +3,9 @@ from typing import Dict, List, Optional, Type
from pydantic import BaseModel
from .swaps import Swap
from .traces import Classification, DecodedCallTrace, Protocol
from .transfers import Transfer
from .swaps import Swap
class Classifier(ABC):

View File

@@ -1,5 +1,7 @@
from typing import List, Optional
from pydantic import BaseModel
from mev_inspect.schemas.traces import Protocol

View File

@@ -8,6 +8,7 @@ from mev_inspect.schemas.traces import Protocol
class Swap(BaseModel):
abi_name: str
transaction_hash: str
transaction_position: int
block_number: int
trace_address: List[int]
contract_address: str

View File

@@ -58,6 +58,7 @@ class ClassifiedTrace(Trace):
value: Optional[int]
gas_used: Optional[int]
transaction_hash: str
transaction_position: int
protocol: Optional[Protocol]
function_name: Optional[str]
function_signature: Optional[str]

View File

@@ -2,7 +2,6 @@ from typing import List
from pydantic import BaseModel
ETH_TOKEN_ADDRESS = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"

View File

@@ -1,13 +1,9 @@
from typing import List, Optional
from mev_inspect.classifiers.specs import get_classifier
from mev_inspect.schemas.traces import (
ClassifiedTrace,
Classification,
DecodedCallTrace,
)
from mev_inspect.schemas.classifiers import SwapClassifier
from mev_inspect.schemas.swaps import Swap
from mev_inspect.schemas.traces import Classification, ClassifiedTrace, DecodedCallTrace
from mev_inspect.schemas.transfers import Transfer
from mev_inspect.traces import get_traces_by_transaction_hash
from mev_inspect.transfers import (

View File

@@ -2,12 +2,9 @@ from typing import Dict, List, Optional, Sequence
from mev_inspect.classifiers.specs import get_classifier
from mev_inspect.schemas.classifiers import TransferClassifier
from mev_inspect.schemas.traces import (
ClassifiedTrace,
DecodedCallTrace,
)
from mev_inspect.schemas.traces import ClassifiedTrace, DecodedCallTrace
from mev_inspect.schemas.transfers import ETH_TOKEN_ADDRESS, Transfer
from mev_inspect.traces import is_child_trace_address, get_child_traces
from mev_inspect.traces import get_child_traces, is_child_trace_address
def get_transfers(traces: List[ClassifiedTrace]) -> List[Transfer]:

35
poetry.lock generated
View File

@@ -383,6 +383,14 @@ category = "main"
optional = false
python-versions = ">=3.6"
[[package]]
name = "gprof2dot"
version = "2021.2.21"
description = "Generate a dot graph from the output of several profilers."
category = "dev"
optional = false
python-versions = "*"
[[package]]
name = "greenlet"
version = "1.1.1"
@@ -768,6 +776,22 @@ toml = "*"
[package.extras]
testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"]
[[package]]
name = "pytest-profiling"
version = "1.7.0"
description = "Profiling plugin for py.test"
category = "dev"
optional = false
python-versions = "*"
[package.dependencies]
gprof2dot = "*"
pytest = "*"
six = "*"
[package.extras]
tests = ["pytest-virtualenv"]
[[package]]
name = "pytest-sugar"
version = "0.9.4"
@@ -1032,7 +1056,7 @@ multidict = ">=4.0"
[metadata]
lock-version = "1.1"
python-versions = "^3.9"
content-hash = "03aa2d5981665ade1b81682c1e797a06b56c5fb68d61ae69fd2f1e95bd32cfb6"
content-hash = "0aa43e887fe106d4142d68b7a891ba94f2de28df9df0ed765d285b1e5ccee391"
[metadata.files]
aiohttp = [
@@ -1362,6 +1386,9 @@ frozenlist = [
{file = "frozenlist-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:735f386ec522e384f511614c01d2ef9cf799f051353876b4c6fb93ef67a6d1ee"},
{file = "frozenlist-1.2.0.tar.gz", hash = "sha256:68201be60ac56aff972dc18085800b6ee07973c49103a8aba669dee3d71079de"},
]
gprof2dot = [
{file = "gprof2dot-2021.2.21.tar.gz", hash = "sha256:1223189383b53dcc8ecfd45787ac48c0ed7b4dbc16ee8b88695d053eea1acabf"},
]
greenlet = [
{file = "greenlet-1.1.1-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:476ba9435afaead4382fbab8f1882f75e3fb2285c35c9285abb3dd30237f9142"},
{file = "greenlet-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:44556302c0ab376e37939fd0058e1f0db2e769580d340fb03b01678d1ff25f68"},
@@ -1771,6 +1798,12 @@ pytest-cov = [
{file = "pytest-cov-2.12.1.tar.gz", hash = "sha256:261ceeb8c227b726249b376b8526b600f38667ee314f910353fa318caa01f4d7"},
{file = "pytest_cov-2.12.1-py2.py3-none-any.whl", hash = "sha256:261bb9e47e65bd099c89c3edf92972865210c36813f80ede5277dceb77a4a62a"},
]
pytest-profiling = [
{file = "pytest-profiling-1.7.0.tar.gz", hash = "sha256:93938f147662225d2b8bd5af89587b979652426a8a6ffd7e73ec4a23e24b7f29"},
{file = "pytest_profiling-1.7.0-py2.7.egg", hash = "sha256:3b255f9db36cb2dd7536a8e7e294c612c0be7f7850a7d30754878e4315d56600"},
{file = "pytest_profiling-1.7.0-py2.py3-none-any.whl", hash = "sha256:999cc9ac94f2e528e3f5d43465da277429984a1c237ae9818f8cfd0b06acb019"},
{file = "pytest_profiling-1.7.0-py3.6.egg", hash = "sha256:6bce4e2edc04409d2f3158c16750fab8074f62d404cc38eeb075dff7fcbb996c"},
]
pytest-sugar = [
{file = "pytest-sugar-0.9.4.tar.gz", hash = "sha256:b1b2186b0a72aada6859bea2a5764145e3aaa2c1cfbb23c3a19b5f7b697563d3"},
]

View File

@@ -25,6 +25,7 @@ coverage = "^5.5"
alembic = "^1.6.5"
CProfileV = "^1.0.7"
regex = "^2021.10.8"
pytest-profiling = "^1.7.0"
[build-system]
requires = ["poetry-core>=1.0.0"]
@@ -64,10 +65,10 @@ exclude = '''
profile = "black"
atomic = true
include_trailing_comma = true
lines_after_imports = 2
lines_between_types = 1
use_parentheses = true
src_paths = ["poetry", "tests"]
src_paths = ["mev_inspect", "tests"]
skip_glob = ["*/setup.py"]
filter_files = true
known_first_party = "poetry"
known_first_party = "mev_inspect"
known_third_party = "alembic"
py_version=39

View File

@@ -3,6 +3,13 @@ from typing import List
import pytest
from mev_inspect.classifiers.trace import TraceClassifier
@pytest.fixture(scope="session")
def trace_classifier() -> TraceClassifier:
return TraceClassifier()
@pytest.fixture(name="get_transaction_hashes")
def fixture_get_transaction_hashes():

View File

@@ -20,6 +20,7 @@ def make_transfer_trace(
):
return DecodedCallTrace(
transaction_hash=transaction_hash,
transaction_position=0,
block_number=block_number,
type=TraceType.call,
trace_address=trace_address,
@@ -53,6 +54,7 @@ def make_swap_trace(
):
return DecodedCallTrace(
transaction_hash=transaction_hash,
transaction_position=0,
block_number=block_number,
type=TraceType.call,
trace_address=trace_address,
@@ -78,6 +80,7 @@ def make_unknown_trace(
return ClassifiedTrace(
block_number=block_number,
transaction_hash=transaction_hash,
transaction_position=0,
trace_address=trace_address,
action={},
subtraces=0,

View File

@@ -1,15 +1,14 @@
from typing import List
from mev_inspect.aave_liquidations import get_aave_liquidations
from mev_inspect.classifiers.trace import TraceClassifier
from mev_inspect.schemas.liquidations import Liquidation
from mev_inspect.schemas.traces import Protocol
from mev_inspect.classifiers.trace import TraceClassifier
from mev_inspect.transfers import ETH_TOKEN_ADDRESS
from tests.utils import load_test_block
def test_single_weth_liquidation():
def test_single_weth_liquidation(trace_classifier: TraceClassifier):
transaction_hash = (
"0xb7575eedc9d8cfe82c4a11cd1a851221f2eafb93d738301995ac7103ffe877f7"
)
@@ -31,15 +30,13 @@ def test_single_weth_liquidation():
]
block = load_test_block(block_number)
trace_classifier = TraceClassifier()
classified_traces = trace_classifier.classify(block.traces)
result = get_aave_liquidations(classified_traces)
_assert_equal_list_of_liquidations(result, liquidations)
def test_single_liquidation():
def test_single_liquidation(trace_classifier: TraceClassifier):
transaction_hash = (
"0xe6c0e3ef0436cb032e1ef292141f4fc4dcd47a75a2559602133114952190e76b"
)
@@ -61,15 +58,13 @@ def test_single_liquidation():
]
block = load_test_block(block_number)
trace_classifier = TraceClassifier()
classified_traces = trace_classifier.classify(block.traces)
result = get_aave_liquidations(classified_traces)
_assert_equal_list_of_liquidations(result, liquidations)
def test_single_liquidation_with_atoken_payback():
def test_single_liquidation_with_atoken_payback(trace_classifier: TraceClassifier):
transaction_hash = (
"0xde551a73e813f1a1e5c843ac2c6a0e40d71618f4040bb7d0cd7cf7b2b6cf4633"
)
@@ -91,15 +86,13 @@ def test_single_liquidation_with_atoken_payback():
]
block = load_test_block(block_number)
trace_classifier = TraceClassifier()
classified_traces = trace_classifier.classify(block.traces)
result = get_aave_liquidations(classified_traces)
_assert_equal_list_of_liquidations(result, liquidations)
def test_multiple_liquidations_in_block():
def test_multiple_liquidations_in_block(trace_classifier: TraceClassifier):
transaction1 = "0xedd062c3a728db4b114f2e83cac281d19a9f753e36afa8a35cdbdf1e1dd5d017"
transaction2 = "0x18492f250cf4735bd67a21c6cc26b7d9c59cf2fb077356dc924f36bc68a810e5"
transaction3 = "0x191b05b28ebaf460e38e90ac6a801681b500f169041ae83a45b32803ef2ec98c"
@@ -145,7 +138,6 @@ def test_multiple_liquidations_in_block():
)
block = load_test_block(block_number)
trace_classifier = TraceClassifier()
classified_traces = trace_classifier.classify(block.traces)
result = get_aave_liquidations(classified_traces)
liquidations = [liquidation1, liquidation2, liquidation3]
@@ -153,8 +145,7 @@ def test_multiple_liquidations_in_block():
_assert_equal_list_of_liquidations(result, liquidations)
def test_liquidations_with_eth_transfer():
def test_liquidations_with_eth_transfer(trace_classifier: TraceClassifier):
transaction_hash = (
"0xf687fedbc4bbc25adb3ef3a35c20c38fb7d35d86d7633d5061d2e3c4f86311b7"
)
@@ -187,7 +178,6 @@ def test_liquidations_with_eth_transfer():
)
block = load_test_block(block_number)
trace_classifier = TraceClassifier()
classified_traces = trace_classifier.classify(block.traces)
result = get_aave_liquidations(classified_traces)
liquidations = [liquidation1, liquidation2]

View File

@@ -1,12 +1,11 @@
from mev_inspect.schemas.swaps import Swap
from mev_inspect.swaps import get_swaps
from mev_inspect.schemas.traces import Protocol
from mev_inspect.classifiers.trace import TraceClassifier
from mev_inspect.schemas.swaps import Swap
from mev_inspect.schemas.traces import Protocol
from mev_inspect.swaps import get_swaps
from tests.utils import load_test_block
def test_fillLimitOrder_swap():
def test_fillLimitOrder_swap(trace_classifier: TraceClassifier):
transaction_hash = (
"0xa043976d736ec8dc930c0556dffd0a86a4bfc80bf98fb7995c791fb4dc488b5d"
)
@@ -15,6 +14,7 @@ def test_fillLimitOrder_swap():
swap = Swap(
abi_name="INativeOrdersFeature",
transaction_hash=transaction_hash,
transaction_position=2,
block_number=block_number,
trace_address=[0, 2, 0, 1],
contract_address="0xdef1c0ded9bec7f1a1670819833240f027b25eff",
@@ -29,15 +29,13 @@ def test_fillLimitOrder_swap():
)
block = load_test_block(block_number)
trace_classifier = TraceClassifier()
classified_traces = trace_classifier.classify(block.traces)
result = get_swaps(classified_traces)
assert result.count(swap) == 1
def test__fillLimitOrder_swap():
def test__fillLimitOrder_swap(trace_classifier: TraceClassifier):
transaction_hash = (
"0x9255addffa2dbeb9560c5e20e78a78c949488d2054c70b2155c39f9e28394cbf"
)
@@ -46,6 +44,7 @@ def test__fillLimitOrder_swap():
swap = Swap(
abi_name="INativeOrdersFeature",
transaction_hash=transaction_hash,
transaction_position=8,
block_number=block_number,
trace_address=[0, 1],
contract_address="0xdef1c0ded9bec7f1a1670819833240f027b25eff",
@@ -60,15 +59,13 @@ def test__fillLimitOrder_swap():
)
block = load_test_block(block_number)
trace_classifier = TraceClassifier()
classified_traces = trace_classifier.classify(block.traces)
result = get_swaps(classified_traces)
assert result.count(swap) == 1
def test_RfqLimitOrder_swap():
def test_RfqLimitOrder_swap(trace_classifier: TraceClassifier):
transaction_hash = (
"0x1c948eb7c59ddbe6b916cf68f5df86eb44a7c9e728221fcd8ab750f137fd2a0f"
)
@@ -77,6 +74,7 @@ def test_RfqLimitOrder_swap():
swap = Swap(
abi_name="INativeOrdersFeature",
transaction_hash=transaction_hash,
transaction_position=9,
block_number=block_number,
trace_address=[0, 1, 13, 0, 1],
contract_address="0xdef1c0ded9bec7f1a1670819833240f027b25eff",
@@ -91,15 +89,13 @@ def test_RfqLimitOrder_swap():
)
block = load_test_block(block_number)
trace_classifier = TraceClassifier()
classified_traces = trace_classifier.classify(block.traces)
result = get_swaps(classified_traces)
assert result.count(swap) == 1
def test__RfqLimitOrder_swap():
def test__RfqLimitOrder_swap(trace_classifier: TraceClassifier):
transaction_hash = (
"0x4f66832e654f8a4d773d9769571155df3722401343247376d6bb56626db29b90"
)
@@ -108,6 +104,7 @@ def test__RfqLimitOrder_swap():
swap = Swap(
abi_name="INativeOrdersFeature",
transaction_hash=transaction_hash,
transaction_position=168,
block_number=block_number,
trace_address=[1, 0, 1, 0, 1],
contract_address="0xdef1c0ded9bec7f1a1670819833240f027b25eff",
@@ -122,7 +119,6 @@ def test__RfqLimitOrder_swap():
)
block = load_test_block(block_number)
trace_classifier = TraceClassifier()
classified_traces = trace_classifier.classify(block.traces)
result = get_swaps(classified_traces)

View File

@@ -5,10 +5,8 @@ from mev_inspect.swaps import get_swaps
from .utils import load_test_block
def test_arbitrage_real_block():
def test_arbitrage_real_block(trace_classifier: TraceClassifier):
block = load_test_block(12914944)
trace_classifier = TraceClassifier()
classified_traces = trace_classifier.classify(block.traces)
swaps = get_swaps(classified_traces)

View File

@@ -1,11 +1,11 @@
from typing import List
from mev_inspect.arbitrages import get_arbitrages, _get_all_routes
from mev_inspect.schemas.swaps import Swap
from mev_inspect.arbitrages import _get_all_routes, get_arbitrages
from mev_inspect.classifiers.specs.uniswap import (
UNISWAP_V2_PAIR_ABI_NAME,
UNISWAP_V3_POOL_ABI_NAME,
)
from mev_inspect.schemas.swaps import Swap
def test_two_pool_arbitrage(get_transaction_hashes, get_addresses):
@@ -25,11 +25,13 @@ def test_two_pool_arbitrage(get_transaction_hashes, get_addresses):
first_token_in_amount = 10
first_token_out_amount = 11
second_token_amount = 15
transaction_position = 0
arb_swaps = [
Swap(
abi_name=UNISWAP_V2_PAIR_ABI_NAME,
transaction_hash=transaction_hash,
transaction_position=transaction_position,
block_number=block_number,
trace_address=[0],
contract_address=first_pool_address,
@@ -43,6 +45,7 @@ def test_two_pool_arbitrage(get_transaction_hashes, get_addresses):
Swap(
abi_name=UNISWAP_V3_POOL_ABI_NAME,
transaction_hash=transaction_hash,
transaction_position=transaction_position,
block_number=block_number,
trace_address=[1],
contract_address=second_pool_address,
@@ -58,6 +61,7 @@ def test_two_pool_arbitrage(get_transaction_hashes, get_addresses):
unrelated_swap = Swap(
abi_name=UNISWAP_V3_POOL_ABI_NAME,
transaction_hash=transaction_hash,
transaction_position=transaction_position,
block_number=block_number,
trace_address=[2, 0],
contract_address=unrelated_pool_address,
@@ -106,11 +110,13 @@ def test_three_pool_arbitrage(get_transaction_hashes, get_addresses):
first_token_out_amount = 11
second_token_amount = 15
third_token_amount = 40
transaction_position = 0
swaps = [
Swap(
abi_name=UNISWAP_V2_PAIR_ABI_NAME,
transaction_hash=transaction_hash,
transaction_position=transaction_position,
block_number=block_number,
trace_address=[0],
contract_address=first_pool_address,
@@ -124,6 +130,7 @@ def test_three_pool_arbitrage(get_transaction_hashes, get_addresses):
Swap(
abi_name=UNISWAP_V3_POOL_ABI_NAME,
transaction_hash=transaction_hash,
transaction_position=transaction_position,
block_number=block_number,
trace_address=[1],
contract_address=second_pool_address,
@@ -137,6 +144,7 @@ def test_three_pool_arbitrage(get_transaction_hashes, get_addresses):
Swap(
abi_name=UNISWAP_V3_POOL_ABI_NAME,
transaction_hash=transaction_hash,
transaction_position=transaction_position,
block_number=block_number,
trace_address=[2],
contract_address=third_pool_address,
@@ -218,6 +226,7 @@ def create_generic_swap(
return Swap(
abi_name=UNISWAP_V3_POOL_ABI_NAME,
transaction_hash="0xfake",
transaction_position=0,
block_number=0,
trace_address=trace_address,
contract_address="0xfake",

View File

@@ -1,14 +1,14 @@
from mev_inspect.classifiers.trace import TraceClassifier
from mev_inspect.compound_liquidations import get_compound_liquidations
from mev_inspect.schemas.liquidations import Liquidation
from mev_inspect.schemas.traces import Protocol
from mev_inspect.classifiers.trace import TraceClassifier
from tests.utils import load_test_block, load_comp_markets, load_cream_markets
from tests.utils import load_comp_markets, load_cream_markets, load_test_block
comp_markets = load_comp_markets()
cream_markets = load_cream_markets()
def test_c_ether_liquidations():
def test_c_ether_liquidations(trace_classifier: TraceClassifier):
block_number = 13234998
transaction_hash = (
"0x78f7e67391c2bacde45e5057241f8b9e21a59330bce4332eecfff8fac279d090"
@@ -21,6 +21,7 @@ def test_c_ether_liquidations():
debt_token_address="0x39aa39c021dfbae8fac545936693ac917d5e7563",
debt_purchase_amount=268066492249420078,
received_amount=4747650169097,
received_token_address="0x4ddc2d193948926d02f9b1fe9e1daa0718270ed5",
protocol=Protocol.compound_v2,
transaction_hash=transaction_hash,
trace_address=[1],
@@ -28,7 +29,6 @@ def test_c_ether_liquidations():
)
]
block = load_test_block(block_number)
trace_classifier = TraceClassifier()
classified_traces = trace_classifier.classify(block.traces)
result = get_compound_liquidations(classified_traces)
assert result == liquidations
@@ -45,6 +45,7 @@ def test_c_ether_liquidations():
debt_token_address="0x35a18000230da775cac24873d00ff85bccded550",
debt_purchase_amount=414547860568297082,
received_amount=321973320649,
received_token_address="0x4ddc2d193948926d02f9b1fe9e1daa0718270ed5",
protocol=Protocol.compound_v2,
transaction_hash=transaction_hash,
trace_address=[1],
@@ -53,7 +54,6 @@ def test_c_ether_liquidations():
]
block = load_test_block(block_number)
trace_classifier = TraceClassifier()
classified_traces = trace_classifier.classify(block.traces)
result = get_compound_liquidations(classified_traces)
assert result == liquidations
@@ -70,6 +70,7 @@ def test_c_ether_liquidations():
debt_token_address="0x35a18000230da775cac24873d00ff85bccded550",
debt_purchase_amount=1106497772527562662,
received_amount=910895850496,
received_token_address="0x4ddc2d193948926d02f9b1fe9e1daa0718270ed5",
protocol=Protocol.compound_v2,
transaction_hash=transaction_hash,
trace_address=[1],
@@ -77,13 +78,12 @@ def test_c_ether_liquidations():
)
]
block = load_test_block(block_number)
trace_classifier = TraceClassifier()
classified_traces = trace_classifier.classify(block.traces)
result = get_compound_liquidations(classified_traces)
assert result == liquidations
def test_c_token_liquidation():
def test_c_token_liquidation(trace_classifier: TraceClassifier):
block_number = 13326607
transaction_hash = (
"0x012215bedd00147c58e1f59807664914b2abbfc13c260190dc9cfc490be3e343"
@@ -96,6 +96,7 @@ def test_c_token_liquidation():
debt_token_address="0x70e36f6bf80a52b3b46b3af8e106cc0ed743e8e4",
debt_purchase_amount=1207055531,
received_amount=21459623305,
received_token_address="0x39aa39c021dfbae8fac545936693ac917d5e7563",
protocol=Protocol.compound_v2,
transaction_hash=transaction_hash,
trace_address=[1],
@@ -103,13 +104,12 @@ def test_c_token_liquidation():
)
]
block = load_test_block(block_number)
trace_classifier = TraceClassifier()
classified_traces = trace_classifier.classify(block.traces)
result = get_compound_liquidations(classified_traces)
assert result == liquidations
def test_cream_token_liquidation():
def test_cream_token_liquidation(trace_classifier: TraceClassifier):
block_number = 12674514
transaction_hash = (
"0x0809bdbbddcf566e5392682a9bd9d0006a92a4dc441163c791b1136f982994b1"
@@ -122,6 +122,7 @@ def test_cream_token_liquidation():
debt_token_address="0x44fbebd2f576670a6c33f6fc0b00aa8c5753b322",
debt_purchase_amount=14857434973806369550,
received_amount=1547215810826,
received_token_address="0x697256caa3ccafd62bb6d3aa1c7c5671786a5fd9",
protocol=Protocol.cream,
transaction_hash=transaction_hash,
trace_address=[],
@@ -129,7 +130,6 @@ def test_cream_token_liquidation():
)
]
block = load_test_block(block_number)
trace_classifier = TraceClassifier()
classified_traces = trace_classifier.classify(block.traces)
result = get_compound_liquidations(classified_traces)
assert result == liquidations

View File

@@ -1,20 +1,16 @@
from mev_inspect.swaps import get_swaps
from mev_inspect.classifiers.specs.balancer import BALANCER_V1_POOL_ABI_NAME
from mev_inspect.classifiers.specs.uniswap import (
UNISWAP_V2_PAIR_ABI_NAME,
UNISWAP_V3_POOL_ABI_NAME,
)
from mev_inspect.classifiers.specs.bancor import (
BANCOR_NETWORK_ABI_NAME,
BANCOR_NETWORK_CONTRACT_ADDRESS,
)
from mev_inspect.schemas.traces import Protocol
from .helpers import (
make_unknown_trace,
make_transfer_trace,
make_swap_trace,
from mev_inspect.classifiers.specs.uniswap import (
UNISWAP_V2_PAIR_ABI_NAME,
UNISWAP_V3_POOL_ABI_NAME,
)
from mev_inspect.schemas.traces import Protocol
from mev_inspect.swaps import get_swaps
from .helpers import make_swap_trace, make_transfer_trace, make_unknown_trace
def test_swaps(

View File

@@ -1,7 +1,7 @@
from typing import List
from mev_inspect.schemas.traces import ClassifiedTrace
from mev_inspect.traces import is_child_trace_address, get_child_traces
from mev_inspect.traces import get_child_traces, is_child_trace_address
from .helpers import make_many_unknown_traces

View File

@@ -4,7 +4,6 @@ from typing import Dict
from mev_inspect.schemas.blocks import Block
THIS_FILE_DIRECTORY = os.path.dirname(__file__)
TEST_BLOCKS_DIRECTORY = os.path.join(THIS_FILE_DIRECTORY, "blocks")