Add nft_trades table to db

This commit is contained in:
Shea Ketsdever 2021-12-19 15:13:01 -08:00
parent b75ee98018
commit 97e6c156ab
9 changed files with 103 additions and 8 deletions

View File

@ -0,0 +1,41 @@
"""Create NFT Trades table
Revision ID: 3c54832385e3
Revises: 15ba9c27ee8a
Create Date: 2021-12-19 22:50:28.936516
"""
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "3c54832385e3"
down_revision = "15ba9c27ee8a"
branch_labels = None
depends_on = None
def upgrade():
op.create_table(
"nft_trades",
sa.Column("created_at", sa.TIMESTAMP, server_default=sa.func.now()),
sa.Column("abi_name", sa.String(1024), nullable=False),
sa.Column("transaction_hash", sa.String(66), nullable=False),
sa.Column("transaction_position", sa.Numeric, nullable=False),
sa.Column("block_number", sa.Numeric, nullable=False),
sa.Column("trace_address", sa.String(256), nullable=False),
sa.Column("protocol", sa.String(256), nullable=False),
sa.Column("error", sa.String(256), nullable=True),
sa.Column("seller_address", sa.String(256), nullable=False),
sa.Column("buyer_address", sa.String(256), nullable=False),
sa.Column("payment_token", sa.String(256), nullable=False),
sa.Column("payment_amount", sa.Numeric, nullable=False),
sa.Column("collection_address", sa.String(256), nullable=False),
sa.Column("token_id", sa.Numeric, nullable=False),
sa.PrimaryKeyConstraint("transaction_hash", "trace_address"),
)
def downgrade():
op.drop_table("nft_trades")

View File

@ -1,5 +1,5 @@
from typing import List, Optional, Sequence from typing import List, Optional, Sequence
from mev_inspect.schemas.nft_trade import NftTrade from mev_inspect.schemas.nft_trades import NftTrade
from mev_inspect.schemas.swaps import Swap from mev_inspect.schemas.swaps import Swap
from mev_inspect.schemas.traces import ClassifiedTrace, DecodedCallTrace from mev_inspect.schemas.traces import ClassifiedTrace, DecodedCallTrace

View File

@ -1,7 +1,7 @@
from typing import List, Optional from typing import List, Optional
from mev_inspect.classifiers.helpers import _filter_transfers, create_nft_trade_from_transfers from mev_inspect.classifiers.helpers import _filter_transfers, create_nft_trade_from_transfers
from mev_inspect.schemas.classifiers import ClassifierSpec, NftTradeClassifier from mev_inspect.schemas.classifiers import ClassifierSpec, NftTradeClassifier
from mev_inspect.schemas.nft_trade import NftTrade from mev_inspect.schemas.nft_trades import NftTrade
from mev_inspect.schemas.traces import DecodedCallTrace, Protocol from mev_inspect.schemas.traces import DecodedCallTrace, Protocol
from mev_inspect.schemas.transfers import ETH_TOKEN_ADDRESS, Transfer from mev_inspect.schemas.transfers import ETH_TOKEN_ADDRESS, Transfer

View File

@ -0,0 +1,28 @@
import json
from typing import List
from mev_inspect.models.nft_trades import NftTradeModel
from mev_inspect.schemas.nft_trades import NftTrade
def delete_nft_trades_for_block(
db_session,
block_number: int,
) -> None:
(
db_session.query(NftTradeModel)
.filter(NftTradeModel.block_number == block_number)
.delete()
)
db_session.commit()
def write_nft_trades(
db_session,
nft_trades: List[NftTrade],
) -> None:
models = [NftTradeModel(**json.loads(nft_trade.json())) for nft_trade in nft_trades]
db_session.bulk_save_objects(models)
db_session.commit()

View File

@ -26,19 +26,21 @@ from mev_inspect.crud.punks import (
write_punk_snipes, write_punk_snipes,
) )
from mev_inspect.crud.sandwiches import delete_sandwiches_for_block, write_sandwiches from mev_inspect.crud.sandwiches import delete_sandwiches_for_block, write_sandwiches
from mev_inspect.nft_trades import get_nft_trades
from mev_inspect.crud.swaps import delete_swaps_for_block, write_swaps from mev_inspect.crud.swaps import delete_swaps_for_block, write_swaps
from mev_inspect.crud.traces import ( from mev_inspect.crud.traces import (
delete_classified_traces_for_block, delete_classified_traces_for_block,
write_classified_traces, write_classified_traces,
) )
from mev_inspect.crud.transfers import delete_transfers_for_block, write_transfers from mev_inspect.crud.transfers import delete_transfers_for_block, write_transfers
from mev_inspect.crud.nft_trades import delete_nft_trades_for_block, write_nft_trades
from mev_inspect.liquidations import get_liquidations from mev_inspect.liquidations import get_liquidations
from mev_inspect.miner_payments import get_miner_payments 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.punks import get_punk_bid_acceptances, get_punk_bids, get_punk_snipes
from mev_inspect.sandwiches import get_sandwiches from mev_inspect.sandwiches import get_sandwiches
from mev_inspect.swaps import get_swaps from mev_inspect.swaps import get_swaps
from mev_inspect.transfers import get_transfers from mev_inspect.transfers import get_transfers
from mev_inspect.nft_trades import get_nft_trades
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -125,6 +127,9 @@ async def inspect_block(
nft_trades = get_nft_trades(classified_traces) nft_trades = get_nft_trades(classified_traces)
logger.info(f"Block: {block_number} -- Found {len(nft_trades)} nft trades") logger.info(f"Block: {block_number} -- Found {len(nft_trades)} nft trades")
delete_nft_trades_for_block(inspect_db_session, block_number)
write_nft_trades(inspect_db_session, nft_trades)
miner_payments = get_miner_payments( miner_payments = get_miner_payments(
block.miner, block.base_fee_per_gas, classified_traces, block.receipts block.miner, block.base_fee_per_gas, classified_traces, block.receipts
) )

View File

@ -0,0 +1,21 @@
from sqlalchemy import ARRAY, Column, Integer, Numeric, String
from .base import Base
class NftTradeModel(Base):
__tablename__ = "nft_trades"
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), primary_key=True)
protocol = Column(String, nullable=True)
error = Column(String, nullable=True)
seller_address = Column(String, nullable=False)
buyer_address = Column(String, nullable=False)
payment_token = Column(String, nullable=False)
payment_amount = Column(Numeric, nullable=False)
collection_address = Column(String, nullable=False)
token_id = Column(Numeric, nullable=False)

View File

@ -1,7 +1,7 @@
from typing import List, Optional from typing import List, Optional
from mev_inspect.classifiers.specs import get_classifier from mev_inspect.classifiers.specs import get_classifier
from mev_inspect.schemas.classifiers import NftTradeClassifier from mev_inspect.schemas.classifiers import NftTradeClassifier
from mev_inspect.schemas.nft_trade import NftTrade from mev_inspect.schemas.nft_trades import NftTrade
from mev_inspect.schemas.traces import Classification, ClassifiedTrace, DecodedCallTrace from mev_inspect.schemas.traces import Classification, ClassifiedTrace, DecodedCallTrace
from mev_inspect.schemas.transfers import Transfer from mev_inspect.schemas.transfers import Transfer
from mev_inspect.traces import get_traces_by_transaction_hash from mev_inspect.traces import get_traces_by_transaction_hash
@ -38,13 +38,13 @@ def _get_nft_trades_for_transaction(
trace.trace_address, trace.trace_address,
traces, traces,
) )
nft_transfer = _parse_trade( nft_trade = _parse_trade(
trace, trace,
remove_child_transfers_of_transfers(child_transfers), remove_child_transfers_of_transfers(child_transfers),
) )
if nft_transfer is not None: if nft_trade is not None:
nft_trades.append(nft_transfer) nft_trades.append(nft_trade)
return nft_trades return nft_trades

View File

@ -6,7 +6,7 @@ from pydantic import BaseModel
from .swaps import Swap from .swaps import Swap
from .traces import Classification, DecodedCallTrace, Protocol from .traces import Classification, DecodedCallTrace, Protocol
from .transfers import Transfer from .transfers import Transfer
from .nft_trade import NftTrade from .nft_trades import NftTrade
class Classifier(ABC): class Classifier(ABC):