repositories
loading repo index
repositories
loading repo index
repository
loading code, commits, and activity
public Clawd ADK gateway launch mirror
stars
latest
clone command
git clone gitlawb://did:key:z6Mkq5mY...iFZ5/my-project-publ...git clone gitlawb://did:key:z6Mkq5mY.../my-project-publ...2fa351d6docs: add automaton and perps launch sources16d ago| #1 | """Enhanced Configuration for Solana Trading Agent""" |
| #2 | |
| #3 | import os |
| #4 | from pathlib import Path |
| #5 | from dataclasses import dataclass, field |
| #6 | from typing import Optional |
| #7 | |
| #8 | import yaml |
| #9 | from dotenv import load_dotenv |
| #10 | |
| #11 | |
| #12 | @dataclass |
| #13 | class RetryConfig: |
| #14 | """Retry configuration""" |
| #15 | enabled: bool = True |
| #16 | max_retries: int = 3 |
| #17 | initial_delay: float = 1.0 |
| #18 | max_delay: float = 60.0 |
| #19 | exponential_base: float = 2.0 |
| #20 | |
| #21 | |
| #22 | @dataclass |
| #23 | class LLMConfig: |
| #24 | """LLM configuration""" |
| #25 | api_key: str |
| #26 | api_base: str = "https://openrouter.ai/api/v1" |
| #27 | model: str = "anthropic/claude-sonnet-4" |
| #28 | max_tokens: int = 4096 |
| #29 | retry: RetryConfig = field(default_factory=RetryConfig) |
| #30 | |
| #31 | |
| #32 | @dataclass |
| #33 | class SolanaConfig: |
| #34 | """Solana connection configuration""" |
| #35 | helius_api_key: str |
| #36 | helius_rpc_url: str |
| #37 | helius_wss_url: str |
| #38 | bags_api_key: str |
| #39 | bags_config_key: str |
| #40 | bags_ref_code: str = "" |
| #41 | birdeye_api_key: str = "" |
| #42 | |
| #43 | |
| #44 | @dataclass |
| #45 | class WalletConfig: |
| #46 | """Wallet configuration""" |
| #47 | address: str |
| #48 | private_key: Optional[str] = None |
| #49 | |
| #50 | |
| #51 | @dataclass |
| #52 | class AgentConfig: |
| #53 | """Agent configuration""" |
| #54 | max_steps: int = 50 |
| #55 | workspace_dir: str = "./workspace" |
| #56 | system_prompt_path: str = "system_prompt.md" |
| #57 | token_limit: int = 80000 |
| #58 | |
| #59 | |
| #60 | @dataclass |
| #61 | class ToolsConfig: |
| #62 | """Tools configuration""" |
| #63 | enable_trading: bool = True |
| #64 | enable_note: bool = True |
| #65 | enable_file_tools: bool = False |
| #66 | enable_bash: bool = False |
| #67 | memory_file: str = ".trading_memory.json" |
| #68 | |
| #69 | |
| #70 | @dataclass |
| #71 | class CDPConfig: |
| #72 | """Coinbase Developer Platform configuration""" |
| #73 | api_key_id: str = "" |
| #74 | api_key_secret: str = "" |
| #75 | wallet_secret: str = "" |
| #76 | rpc_url: str = "https://api.mainnet-beta.solana.com" |
| #77 | network: str = "solana-mainnet" # solana-mainnet or solana-devnet |
| #78 | |
| #79 | |
| #80 | @dataclass |
| #81 | class HyperliquidConfig: |
| #82 | """Hyperliquid DEX configuration""" |
| #83 | wallet: str = "" |
| #84 | private_key: str = "" |
| #85 | use_testnet: bool = False |
| #86 | |
| #87 | |
| #88 | @dataclass |
| #89 | class SolanaAgentConfig: |
| #90 | """Main configuration class for Solana Trading Agent""" |
| #91 | |
| #92 | llm: LLMConfig |
| #93 | solana: SolanaConfig |
| #94 | wallet: WalletConfig |
| #95 | agent: AgentConfig = field(default_factory=AgentConfig) |
| #96 | tools: ToolsConfig = field(default_factory=ToolsConfig) |
| #97 | cdp: CDPConfig = field(default_factory=CDPConfig) |
| #98 | hyperliquid: HyperliquidConfig = field(default_factory=HyperliquidConfig) |
| #99 | |
| #100 | @classmethod |
| #101 | def from_env(cls, env_path: Optional[str] = None) -> "SolanaAgentConfig": |
| #102 | """Load configuration from environment variables or .env file.""" |
| #103 | |
| #104 | # Load .env file |
| #105 | if env_path: |
| #106 | load_dotenv(env_path) |
| #107 | else: |
| #108 | for path in [".env.local", ".env", "../.env.local", "../.env"]: |
| #109 | if Path(path).exists(): |
| #110 | load_dotenv(path) |
| #111 | break |
| #112 | |
| #113 | # Validate required fields |
| #114 | missing = [] |
| #115 | |
| #116 | helius_api_key = os.getenv("HELIUS_API_KEY") |
| #117 | if not helius_api_key: |
| #118 | missing.append("HELIUS_API_KEY") |
| #119 | |
| #120 | helius_rpc_url = os.getenv("HELIUS_RPC_URL") |
| #121 | if not helius_rpc_url: |
| #122 | missing.append("HELIUS_RPC_URL") |
| #123 | |
| #124 | bags_api_key = os.getenv("BAGS_API_KEY") |
| #125 | if not bags_api_key: |
| #126 | missing.append("BAGS_API_KEY") |
| #127 | |
| #128 | bags_config_key = os.getenv("BAGS_CONFIG_KEY") |
| #129 | if not bags_config_key: |
| #130 | missing.append("BAGS_CONFIG_KEY") |
| #131 | |
| #132 | birdeye_api_key = os.getenv("BIRDEYE_API_KEY") |
| #133 | if not birdeye_api_key: |
| #134 | missing.append("BIRDEYE_API_KEY") |
| #135 | |
| #136 | wallet_address = os.getenv("MAWD_WALLET") |
| #137 | if not wallet_address: |
| #138 | missing.append("MAWD_WALLET") |
| #139 | |
| #140 | openrouter_api_key = os.getenv("OPENROUTER_API_KEY") |
| #141 | if not openrouter_api_key: |
| #142 | missing.append("OPENROUTER_API_KEY") |
| #143 | |
| #144 | if missing: |
| #145 | raise ValueError(f"Missing required environment variables: {', '.join(missing)}") |
| #146 | |
| #147 | # Build configs |
| #148 | llm_config = LLMConfig( |
| #149 | api_key=openrouter_api_key, |
| #150 | api_base=os.getenv("OPENROUTER_API_BASE", "https://openrouter.ai/api/v1"), |
| #151 | model=os.getenv("OPENROUTER_CLAUDE", "anthropic/claude-sonnet-4"), |
| #152 | ) |
| #153 | |
| #154 | solana_config = SolanaConfig( |
| #155 | helius_api_key=helius_api_key, |
| #156 | helius_rpc_url=helius_rpc_url, |
| #157 | helius_wss_url=os.getenv("HELIUS_WSS_URL", f"wss://mainnet.helius-rpc.com/?api-key={helius_api_key}"), |
| #158 | bags_api_key=bags_api_key, |
| #159 | bags_config_key=bags_config_key, |
| #160 | bags_ref_code=os.getenv("BAGS_REF_CODE", ""), |
| #161 | birdeye_api_key=birdeye_api_key, |
| #162 | ) |
| #163 | |
| #164 | wallet_config = WalletConfig( |
| #165 | address=wallet_address, |
| #166 | private_key=os.getenv("MAWD_PRIVATE_KEY"), |
| #167 | ) |
| #168 | |
| #169 | agent_config = AgentConfig( |
| #170 | max_steps=int(os.getenv("AGENT_MAX_STEPS", "50")), |
| #171 | workspace_dir=os.getenv("AGENT_WORKSPACE", "./workspace"), |
| #172 | ) |
| #173 | |
| #174 | tools_config = ToolsConfig( |
| #175 | enable_trading=True, |
| #176 | enable_note=True, |
| #177 | ) |
| #178 | |
| #179 | # CDP config (optional) - defaults to mainnet |
| #180 | cdp_rpc_url = os.getenv("CDP_RPC_URL") or helius_rpc_url or "https://api.mainnet-beta.solana.com" |
| #181 | cdp_config = CDPConfig( |
| #182 | api_key_id=os.getenv("CDP_API_KEY_ID", ""), |
| #183 | api_key_secret=os.getenv("CDP_API_KEY_SECRET", ""), |
| #184 | wallet_secret=os.getenv("CDP_WALLET_SECRET", ""), |
| #185 | rpc_url=cdp_rpc_url, |
| #186 | network=os.getenv("CDP_NETWORK", "solana-mainnet"), |
| #187 | ) |
| #188 | |
| #189 | # Hyperliquid config (optional) |
| #190 | hyperliquid_config = HyperliquidConfig( |
| #191 | wallet=os.getenv("HYPERLIQUID_WALLET", ""), |
| #192 | private_key=os.getenv("HYPERLIQUID_PRIVATE_KEY", ""), |
| #193 | use_testnet=os.getenv("HYPERLIQUID_USE_TESTNET", "false").lower() == "true", |
| #194 | ) |
| #195 | |
| #196 | return cls( |
| #197 | llm=llm_config, |
| #198 | solana=solana_config, |
| #199 | wallet=wallet_config, |
| #200 | agent=agent_config, |
| #201 | tools=tools_config, |
| #202 | cdp=cdp_config, |
| #203 | hyperliquid=hyperliquid_config, |
| #204 | ) |
| #205 | |
| #206 | @classmethod |
| #207 | def from_yaml(cls, config_path: str | Path, env_path: Optional[str] = None) -> "SolanaAgentConfig": |
| #208 | """Load configuration from YAML file with env fallbacks.""" |
| #209 | |
| #210 | # Load environment first |
| #211 | if env_path: |
| #212 | load_dotenv(env_path) |
| #213 | else: |
| #214 | for path in [".env.local", ".env", "../.env.local", "../.env"]: |
| #215 | if Path(path).exists(): |
| #216 | load_dotenv(path) |
| #217 | break |
| #218 | |
| #219 | config_path = Path(config_path) |
| #220 | if not config_path.exists(): |
| #221 | raise FileNotFoundError(f"Configuration file not found: {config_path}") |
| #222 | |
| #223 | with open(config_path, encoding="utf-8") as f: |
| #224 | data = yaml.safe_load(f) or {} |
| #225 | |
| #226 | # LLM config |
| #227 | llm_data = data.get("llm", {}) |
| #228 | llm_config = LLMConfig( |
| #229 | api_key=llm_data.get("api_key") or os.getenv("OPENROUTER_API_KEY"), |
| #230 | api_base=llm_data.get("api_base", os.getenv("OPENROUTER_API_BASE", "https://openrouter.ai/api/v1")), |
| #231 | model=llm_data.get("model", os.getenv("OPENROUTER_CLAUDE", "anthropic/claude-sonnet-4")), |
| #232 | max_tokens=llm_data.get("max_tokens", 4096), |
| #233 | ) |
| #234 | |
| #235 | # Solana config |
| #236 | solana_data = data.get("solana", {}) |
| #237 | solana_config = SolanaConfig( |
| #238 | helius_api_key=solana_data.get("helius_api_key") or os.getenv("HELIUS_API_KEY"), |
| #239 | helius_rpc_url=solana_data.get("helius_rpc_url") or os.getenv("HELIUS_RPC_URL"), |
| #240 | helius_wss_url=solana_data.get("helius_wss_url") or os.getenv("HELIUS_WSS_URL"), |
| #241 | bags_api_key=solana_data.get("bags_api_key") or os.getenv("BAGS_API_KEY"), |
| #242 | bags_config_key=solana_data.get("bags_config_key") or os.getenv("BAGS_CONFIG_KEY"), |
| #243 | bags_ref_code=solana_data.get("bags_ref_code") or os.getenv("BAGS_REF_CODE", ""), |
| #244 | birdeye_api_key=solana_data.get("birdeye_api_key") or os.getenv("BIRDEYE_API_KEY"), |
| #245 | ) |
| #246 | |
| #247 | # Wallet config |
| #248 | wallet_data = data.get("wallet", {}) |
| #249 | wallet_config = WalletConfig( |
| #250 | address=wallet_data.get("address") or os.getenv("MAWD_WALLET"), |
| #251 | private_key=wallet_data.get("private_key") or os.getenv("MAWD_PRIVATE_KEY"), |
| #252 | ) |
| #253 | |
| #254 | # Agent config |
| #255 | agent_data = data.get("agent", {}) |
| #256 | agent_config = AgentConfig( |
| #257 | max_steps=agent_data.get("max_steps", 50), |
| #258 | workspace_dir=agent_data.get("workspace_dir", "./workspace"), |
| #259 | system_prompt_path=agent_data.get("system_prompt_path", "system_prompt.md"), |
| #260 | token_limit=agent_data.get("token_limit", 80000), |
| #261 | ) |
| #262 | |
| #263 | # Tools config |
| #264 | tools_data = data.get("tools", {}) |
| #265 | tools_config = ToolsConfig( |
| #266 | enable_trading=tools_data.get("enable_trading", True), |
| #267 | enable_note=tools_data.get("enable_note", True), |
| #268 | enable_file_tools=tools_data.get("enable_file_tools", False), |
| #269 | enable_bash=tools_data.get("enable_bash", False), |
| #270 | memory_file=tools_data.get("memory_file", ".trading_memory.json"), |
| #271 | ) |
| #272 | |
| #273 | # CDP config |
| #274 | cdp_data = data.get("cdp", {}) |
| #275 | cdp_config = CDPConfig( |
| #276 | api_key_id=cdp_data.get("api_key_id") or os.getenv("CDP_API_KEY_ID", ""), |
| #277 | api_key_secret=cdp_data.get("api_key_secret") or os.getenv("CDP_API_KEY_SECRET", ""), |
| #278 | wallet_secret=cdp_data.get("wallet_secret") or os.getenv("CDP_WALLET_SECRET", ""), |
| #279 | rpc_url=cdp_data.get("rpc_url") or os.getenv("CDP_RPC_URL", "https://api.mainnet-beta.solana.com"), |
| #280 | network=cdp_data.get("network") or os.getenv("CDP_NETWORK", "solana-mainnet"), |
| #281 | ) |
| #282 | |
| #283 | # Hyperliquid config |
| #284 | hl_data = data.get("hyperliquid", {}) |
| #285 | hyperliquid_config = HyperliquidConfig( |
| #286 | wallet=hl_data.get("wallet") or os.getenv("HYPERLIQUID_WALLET", ""), |
| #287 | private_key=hl_data.get("private_key") or os.getenv("HYPERLIQUID_PRIVATE_KEY", ""), |
| #288 | use_testnet=hl_data.get("use_testnet") or os.getenv("HYPERLIQUID_USE_TESTNET", "false").lower() == "true", |
| #289 | ) |
| #290 | |
| #291 | return cls( |
| #292 | llm=llm_config, |
| #293 | solana=solana_config, |
| #294 | wallet=wallet_config, |
| #295 | agent=agent_config, |
| #296 | tools=tools_config, |
| #297 | cdp=cdp_config, |
| #298 | hyperliquid=hyperliquid_config, |
| #299 | ) |
| #300 | |
| #301 | |
| #302 | def load_config(env_path: Optional[str] = None) -> SolanaAgentConfig: |
| #303 | """Load configuration from environment variables.""" |
| #304 | return SolanaAgentConfig.from_env(env_path) |
| #305 |