# API Reference — Execution Engine ## Base Types ### `TradeOrder` ```python @dataclass class TradeOrder: action: str # "buy" or "sell" token_in: str # Input token address token_out: str # Output token address amount: float # Amount of token_in to spend slippage_bps: int # Slippage tolerance in basis points (50 = 0.5%) chain: str # "solana", "ethereum", "base", etc. priority_fee: float | None = None # Optional gas/priority fee override ``` ### `TradeResult` ```python @dataclass class TradeResult: success: bool tx_hash: str amount_in: float amount_out: float price_impact: float # Percentage gas_cost: float # In native token timestamp: str ``` --- ## `JupiterExecutor` (Solana) ```python from tradingagents.execution import JupiterExecutor executor = JupiterExecutor( rpc_url="https://api.mainnet-beta.solana.com", private_key="", # From SOLANA_PRIVATE_KEY ) ``` ### Methods #### `async get_quote(order: TradeOrder) -> dict` Fetches a swap route from the Jupiter Aggregator V6 API. ```python quote = await executor.get_quote(order) # Returns raw Jupiter quote dict with fields like: # { "inputMint": ..., "outputMint": ..., "outAmount": ... } ``` **Quota:** 1 HTTP GET to `https://quote-api.jup.ag/v6/quote` #### `async execute_swap(order: TradeOrder) -> TradeResult` Full swap execution: 1. Gets quote 2. POSTs to `/v6/swap` to get serialized transaction 3. Signs with `solders.Keypair` 4. Sends via Solana RPC #### `async get_wallet_balance(token_address: str) -> float` Returns the token balance for the configured wallet. *(Stub — implement for Scenario 3)* --- ## `OneInchExecutor` (EVM) ```python from tradingagents.execution import OneInchExecutor executor = OneInchExecutor( rpc_url="https://eth-mainnet.g.alchemy.com/v2/YOUR_KEY", private_key="0x", # From ETH_PRIVATE_KEY chain_id=1, # 1=Ethereum, 8453=Base, 42161=Arbitrum ) ``` ### Methods #### `async get_quote(order: TradeOrder) -> dict` Fetches price estimate from 1inch V6 API. ```python quote = await executor.get_quote(order) # Returns: { "dstAmount": "50000000000000000", ... } ``` #### `async execute_swap(order: TradeOrder) -> TradeResult` Full EVM swap: 1. Calls `/swap/v6.0/{chainId}/swap` to get calldata 2. Builds EIP-155 transaction with nonce + gas 3. Signs with `web3.eth.account` 4. Broadcasts via `eth_sendRawTransaction` --- ## `OrderManager` Converts LLM agent signals (`"BUY"`, `"SELL"`, `"HOLD"`) into executable `TradeOrder` objects. ```python from tradingagents.execution import OrderManager manager = OrderManager( risk_params={ "max_position_size": 1000.0, # USD "default_buy_amount": 100.0, # USD per buy } ) ``` ### `async process_signal(signal, token_address, portfolio, chain) -> TradeOrder | None` | Signal | Behaviour | |---|---| | `"BUY"` | Spends `default_buy_amount` USDC → target token (capped by `max_position_size`) | | `"SELL"` | Sells entire position of target token → USDC | | `"HOLD"` | Returns `None` — no trade | --- ## `GoogleSearchClient` + `QuotaManager` ```python import os from tradingagents.dataflows.google_search_tools import GoogleSearchClient, QuotaExceededError client = GoogleSearchClient( api_key=os.environ["GOOGLE_SEARCH_API_KEY"], cx=os.environ["GOOGLE_SEARCH_ENGINE_ID"], daily_limit=95, # Hard cap — raises QuotaExceededError when reached warn_threshold=0.8, # Logs warning at 80% usage ) results = await client.search("solana DeFi TVL", num=5) # Returns: list[SearchResult(title, link, snippet)] print(client.quota_status) # { "usage_today": 3, "daily_limit": 95, "remaining": 92, "is_near_limit": False } ``` --- ## `WebResearchAnalyst` ```python from tradingagents.agents.analysts.web_research_analyst import WebResearchAnalyst analyst = WebResearchAnalyst() # Reads GOOGLE_SEARCH_* from env report = await analyst.research_token( token_name="Solana", token_address="So11111111111111111111111111111111111111112", ) print(report.to_text()) # LLM-ready markdown report ``` ### Report Categories | Attribute | Description | |---|---| | `security_findings` | Results from honeypot.is, tokensniffer | | `news_findings` | Results from coindesk, theblock, bloomberg | | `analytics_findings` | Results from defillama, dune, dexscreener | | `sentiment_findings` | Results from lunarcrush | | `quota_status` | Current daily usage stats | **Quota cost:** 4 queries per `research_token()` call (one per category). --- ## `PortfolioTracker` ```python from tradingagents.portfolio import PortfolioTracker tracker = PortfolioTracker(rpc_url="https://api.mainnet-beta.solana.com") portfolio = await tracker.get_portfolio_state(wallet="
", chain="solana") print(portfolio.total_value_usd) # e.g. 5420.75 print(portfolio.positions["So1111..."]) # PositionInfo object ``` Stubs `_fetch_token_balances` and `_fetch_token_prices` — implement for Scenario 3 with real RPC/price oracle calls.