"""DeFi data routes via DefiLlama API.""" from fastapi import APIRouter, HTTPException, Query import defi_service from models import ApiResponse from route_utils import safe router = APIRouter(prefix="/api/v1/defi") @router.get("/tvl/protocols", response_model=ApiResponse) @safe async def tvl_protocols() -> ApiResponse: """Get top DeFi protocols ranked by TVL.""" data = await defi_service.get_top_protocols() return ApiResponse(data=data) @router.get("/tvl/chains", response_model=ApiResponse) @safe async def tvl_chains() -> ApiResponse: """Get TVL rankings for all chains.""" data = await defi_service.get_chain_tvls() return ApiResponse(data=data) @router.get("/tvl/{protocol}", response_model=ApiResponse) @safe async def protocol_tvl(protocol: str) -> ApiResponse: """Get current TVL for a specific protocol slug.""" tvl = await defi_service.get_protocol_tvl(protocol) if tvl is None: raise HTTPException(status_code=404, detail=f"Protocol '{protocol}' not found") return ApiResponse(data={"protocol": protocol, "tvl": tvl}) @router.get("/yields", response_model=ApiResponse) @safe async def yield_pools( chain: str | None = Query(default=None, description="Filter by chain name"), project: str | None = Query(default=None, description="Filter by project name"), ) -> ApiResponse: """Get top yield pools, optionally filtered by chain and/or project.""" data = await defi_service.get_yield_pools(chain=chain, project=project) return ApiResponse(data=data) @router.get("/stablecoins", response_model=ApiResponse) @safe async def stablecoins() -> ApiResponse: """Get top stablecoins by circulating supply.""" data = await defi_service.get_stablecoins() return ApiResponse(data=data) @router.get("/volumes/dexs", response_model=ApiResponse) @safe async def dex_volumes() -> ApiResponse: """Get DEX volume overview including top protocols.""" data = await defi_service.get_dex_volumes() if data is None: raise HTTPException( status_code=502, detail="Failed to fetch DEX volume data from DefiLlama", ) return ApiResponse(data=data) @router.get("/fees", response_model=ApiResponse) @safe async def protocol_fees() -> ApiResponse: """Get protocol fees and revenue overview.""" data = await defi_service.get_protocol_fees() return ApiResponse(data=data)