66 lines
2.4 KiB
Python
66 lines
2.4 KiB
Python
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") |