from datetime import datetime from sqlalchemy import (Boolean, Column, DateTime, Float, ForeignKey, Integer, String, Text) from sqlalchemy.orm import relationship from app.db.session import Base class Block(Base): __tablename__ = "blocks" id = Column(Integer, primary_key=True, index=True) slot = Column(Integer, unique=True, index=True) blockhash = Column(String, unique=True, index=True) parent_blockhash = Column(String, index=True) timestamp = Column(DateTime, default=datetime.utcnow) processed = Column(Boolean, default=False) transactions = relationship("Transaction", back_populates="block") class Transaction(Base): __tablename__ = "transactions" id = Column(Integer, primary_key=True, index=True) signature = Column(String, unique=True, index=True) block_id = Column(Integer, ForeignKey("blocks.slot")) timestamp = Column(DateTime, default=datetime.utcnow) fee = Column(Integer) status = Column(String) raw_data = Column(Text) block = relationship("Block", back_populates="transactions") token_transfers = relationship("TokenTransfer", back_populates="transaction") arbitrage_events = relationship("ArbitrageEvent", back_populates="transaction") class TokenTransfer(Base): __tablename__ = "token_transfers" id = Column(Integer, primary_key=True, index=True) transaction_id = Column(Integer, ForeignKey("transactions.id")) token_address = Column(String, index=True) from_address = Column(String, index=True) to_address = Column(String, index=True) amount = Column(Float) program_id = Column(String, index=True) timestamp = Column(DateTime, default=datetime.utcnow) transaction = relationship("Transaction", back_populates="token_transfers") class ArbitrageEvent(Base): __tablename__ = "arbitrage_events" id = Column(Integer, primary_key=True, index=True) transaction_id = Column(Integer, ForeignKey("transactions.id")) profit_token_address = Column(String, index=True) profit_amount = Column(Float) profit_usd = Column(Float, nullable=True) path = Column(Text) # JSON string of token paths confidence_score = Column(Float) # 0.0 to 1.0 detected_at = Column(DateTime, default=datetime.utcnow) transaction = relationship("Transaction", back_populates="arbitrage_events")