55from heapq import nlargest
66from typing import Optional , Literal
77
8- import httpx
98from pydantic import BaseModel , Field
109from textwrap import dedent
1110from loguru import logger
1211
13- from sqlalchemy import Column , Integer , String , DateTime , text as sa_text
12+ from sqlalchemy import Column , Integer , String , DateTime
1413from sqlalchemy .ext .declarative import declarative_base
1514from sqlalchemy .orm import sessionmaker
1615from langchain .prompts import PromptTemplate
@@ -54,13 +53,13 @@ class PendleMarket(Base):
5453
5554class DatabaseConfig (BaseModel ):
5655 """Database configuration for the tool"""
56+
5757 type : Literal ["sqlite" , "postgres" ] = Field (
58- default = "sqlite" ,
59- description = "Type of database to use"
58+ default = "sqlite" , description = "Type of database to use"
6059 )
6160 url : Optional [str ] = Field (
6261 default = None ,
63- description = "Database URL. For postgres: postgresql://user:password@host:port/database, for sqlite: sqlite:///path/to/file.db"
62+ description = "Database URL. For postgres: postgresql://user:password@host:port/database, for sqlite: sqlite:///path/to/file.db" ,
6463 )
6564
6665
@@ -73,7 +72,7 @@ class PendleMarketConfig(BaseModel):
7372 )
7473 db_url : Optional [str ] = Field (
7574 default = None ,
76- description = "Database URL. For postgres: postgresql://user:password@host:port/database, for sqlite: sqlite:///path/to/file.db"
75+ description = "Database URL. For postgres: postgresql://user:password@host:port/database, for sqlite: sqlite:///path/to/file.db" ,
7776 )
7877
7978
@@ -91,7 +90,9 @@ def _init_database(self, db_url: Optional[str]) -> None:
9190 """Initialize database connection based on configuration"""
9291 # Set default configuration if not provided
9392 if not db_url :
94- db_url = 'sqlite:///' + os .path .join (os .getcwd (), "storage" , f"{ self .name } .db" )
93+ db_url = "sqlite:///" + os .path .join (
94+ os .getcwd (), "storage" , f"{ self .name } .db"
95+ )
9596
9697 # Create engine using the database module's create_engine function
9798 engine = create_engine (db_url )
@@ -233,16 +234,22 @@ def _process_market_data(results: dict) -> PendleMarketSnapshot:
233234 new_markets = [market for market in markets if market .isNewPool ]
234235 existing_markets = [market for market in markets if not market .isNewPool ]
235236
236- def get_top_markets (markets : list [PendleMarketData ], key_attr : str , n : int = 3 ) -> list [PendleMarketData ]:
237+ def get_top_markets (
238+ markets : list [PendleMarketData ], key_attr : str , n : int = 3
239+ ) -> list [PendleMarketData ]:
237240 """Helper function to get top n markets based on a specific attribute"""
238- filtered_markets = [m for m in markets if m and getattr (m , key_attr ) is not None ]
241+ filtered_markets = [
242+ m for m in markets if m and getattr (m , key_attr ) is not None
243+ ]
239244 return nlargest (n , filtered_markets , key = lambda x : getattr (x , key_attr ))
240245
241246 # Get top markets for both liquidity and APY
242- liquidity_increase = get_top_markets (existing_markets , 'liquidityChange24h' )
243- new_market_liquidity_increase = get_top_markets (new_markets , 'liquidityChange24h' )
244- apy_increase = get_top_markets (existing_markets , 'impliedApyChange24h' )
245- new_market_apy_increase = get_top_markets (new_markets , 'impliedApyChange24h' )
247+ liquidity_increase = get_top_markets (existing_markets , "liquidityChange24h" )
248+ new_market_liquidity_increase = get_top_markets (
249+ new_markets , "liquidityChange24h"
250+ )
251+ apy_increase = get_top_markets (existing_markets , "impliedApyChange24h" )
252+ new_market_apy_increase = get_top_markets (new_markets , "impliedApyChange24h" )
246253
247254 # Extract symbols from sorted markets in one step
248255 liquidity_increase_top_symbols = {
@@ -258,10 +265,10 @@ def get_top_markets(markets: list[PendleMarketData], key_attr: str, n: int = 3)
258265
259266 # Combine all relevant symbols
260267 relevant_symbols = (
261- liquidity_increase_top_symbols
262- | new_market_liquidity_increase_symbols
263- | apy_increase_symbols
264- | new_market_apy_increase_symbols
268+ liquidity_increase_top_symbols
269+ | new_market_liquidity_increase_symbols
270+ | apy_increase_symbols
271+ | new_market_apy_increase_symbols
265272 )
266273
267274 # Filter markets to include only those in the relevant symbols set
0 commit comments