Automated Action 5bb78bd9be Implement Solana arbitrage analytics backend
- Create project structure with FastAPI
- Add database models for blocks, transactions, arbitrages, pools, and DEXes
- Implement Solana RPC client for fetching blockchain data
- Create arbitrage detection algorithm
- Implement comprehensive API endpoints for analytics
- Set up database migrations with Alembic
- Add detailed project documentation

generated with BackendIM... (backend.im)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-12 14:13:06 +00:00

99 lines
2.6 KiB
Python

from typing import Any, List, Optional
from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy.orm import Session
from app import crud
from app.api import deps
from app.schemas.block import Block, BlockList
from app.schemas.transaction import Transaction, TransactionList
router = APIRouter()
@router.get("/", response_model=BlockList)
def read_blocks(
db: Session = Depends(deps.get_db),
skip: int = 0,
limit: int = 100
) -> Any:
"""
Retrieve blocks with pagination.
"""
blocks = crud.block.get_multi(db, skip=skip, limit=limit)
total = crud.block.get_count(db)
return {"blocks": blocks, "total": total}
@router.get("/latest", response_model=List[Block])
def read_latest_blocks(
db: Session = Depends(deps.get_db),
limit: int = Query(20, ge=1, le=100)
) -> Any:
"""
Retrieve the latest blocks.
"""
blocks = crud.block.get_latest_blocks(db, limit=limit)
return blocks
@router.get("/{block_id}", response_model=Block)
def read_block(
block_id: int,
db: Session = Depends(deps.get_db),
) -> Any:
"""
Get a specific block by id.
"""
block = crud.block.get(db, id=block_id)
if not block:
raise HTTPException(status_code=404, detail="Block not found")
return block
@router.get("/height/{height}", response_model=Block)
def read_block_by_height(
height: int,
db: Session = Depends(deps.get_db),
) -> Any:
"""
Get a specific block by height.
"""
block = crud.block.get_by_height(db, height=height)
if not block:
raise HTTPException(status_code=404, detail="Block not found")
return block
@router.get("/hash/{block_hash}", response_model=Block)
def read_block_by_hash(
block_hash: str,
db: Session = Depends(deps.get_db),
) -> Any:
"""
Get a specific block by hash.
"""
block = crud.block.get_by_hash(db, block_hash=block_hash)
if not block:
raise HTTPException(status_code=404, detail="Block not found")
return block
@router.get("/{block_id}/transactions", response_model=TransactionList)
def read_block_transactions(
block_id: int,
db: Session = Depends(deps.get_db),
skip: int = 0,
limit: int = 100
) -> Any:
"""
Get transactions for a specific block.
"""
block = crud.block.get(db, id=block_id)
if not block:
raise HTTPException(status_code=404, detail="Block not found")
transactions = crud.transaction.get_by_block(db, block_id=block_id, skip=skip, limit=limit)
total = crud.transaction.get_by_block_count(db, block_id=block_id)
return {"transactions": transactions, "total": total}