| | |
| | """ |
| | Shared configuration. |
| | |
| | Includes: |
| | 1. System prompt templates |
| | 2. Token mappings (symbol -> contract address) |
| | 3. Tool definitions |
| | 4. Supported chains |
| | """ |
| |
|
| | |
| | |
| | |
| |
|
| | |
| | SOLANA_TOKENS = { |
| | |
| | "SOL": "So11111111111111111111111111111111111111112", |
| | |
| | |
| | "USDC": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", |
| | "USDT": "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB", |
| | |
| | |
| | "RAY": "4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R", |
| | "JUP": "JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN", |
| | "BONK": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263", |
| | "WIF": "EKpQGSJtjMFqKZ9KQanSqYXRcF8fBopzLHYxdM65zcjm", |
| | "ORCA": "orcaEKTdK7LKz57vaAYr9QeNsVEPfiu6QeMU1kektZE", |
| | "MNGO": "MangoCzJ36AjZyKwVj3VnYU4GTonjfVEnJmvvWaxLac", |
| | "SRM": "SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt", |
| | "STEP": "StepAscQoEioFxxWGnh2sLBDFp9d8rvKz2Yp39iDpyT", |
| | "COPE": "8HGyAAB1yoM1ttS7pXjHMa3dukTFGQggnFFH3hJZgzQh", |
| | "FIDA": "EchesyfXePKdLtoiZSL8pBe8Myagyy8ZRqsACNCFGnvp", |
| | "MAPS": "MAPS41MDahZ9QdKXhVa4dWB9RuyfV4XqhyAZ8XcYepb", |
| | "OXY": "z3dn17yLaGMKffVogeFHQ9zWVcXgqgf3PQnDsNs2g6M", |
| | "MEDIA": "ETAtLmCmsoiEEKfNrHKJ2kYy3MoABhU6NQvpSfij5tDs", |
| | "SLND": "SLNDpmoWTVADgEdndyvWzroNL7zSi1dF9PC3xHGtPwp", |
| | "SAMO": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU", |
| | |
| | |
| | "POPCAT": "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr", |
| | "TRUMP": "6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN", |
| | "MELANIA": "FUAfBo2jgks6gB4Z4LfZkqSZgzNucisEHqnNebaRxM1P", |
| | "PEPE": "CLoUDKc4Ane7HeQcPpE3YHnznRxhMimJ4MyaUqyHFzAu", |
| | "DOGE": "9nEqaUcb16sQ3Tn1psbkWqyhPdLmfHWjKGymREjsAgTE", |
| | "SHIB": "CiKu4eHsVrc1eueVQeHn7qhXTcVu95gSQmBpX4utjL9z", |
| | "FLOKI": "FLKiaqMsaLwSZLqnCpSFHktMUQsXgcrhFN3TZg1Zj2EN", |
| | "WOJAK": "8cMrxCkREwszByAj9hzn5qKLnLjvLDU7gPYtWQgfwSAS", |
| | "GIGA": "63LfDmNb3MQ8mw9MtZ2To9bEA2M71kZUUGq5tiJxcqj9", |
| | "BOME": "ukHH6c7mMyiWCf1b9pnWe25TSpkDDt3H5pQZgZ74J82", |
| | "SLERF": "7BgBvyjrZX1YKz4oh9mjb8ZScatkkwb8DzFx7LoiVkM3", |
| | "MEW": "MEW1gQWJ3nEXg2qgERiKu7FAFj79PHvQVREQUzScPP5", |
| | "MYRO": "HhJpBhRRn4g56VsyLuT8DL5Bv31HkXqsrahTTUCZeZg4", |
| | "PONKE": "5z3EqYQo9HiCEs3R84RCDMu2n7anpDMxRhdK8PSWmrRC", |
| | "MOODENG": "ED5nyyWEzpPPiWimP8vYm7sD7TD3LAt3Q3gRTWHzPJBY", |
| | |
| | |
| | "PYTH": "HZ1JovNiVvGrGNiiYvEozEVgZ58xaU3RKwX8eACQBCt3", |
| | "JTO": "jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL", |
| | "W": "85VBFQZC9TZkfaptBWjvUw7YbZjy52A6mjtPGjstQAmQ", |
| | "RENDER": "rndrizKT3MK1iimdxRdWabcF7Zg7AR5T4nud4EkHBof", |
| | "HNT": "hntyVP6YFm1Hg25TN9WGLqM12b8TQmcknKrdu1oxWux", |
| | "INJ": "6McPRfPV6bY1e9hLxWyG54W9i9Epq75QBvXg2oetBVTB", |
| | |
| | |
| | "WETH": "7vfCXTUXx5WJV5JADk17DUJ4ksgau7utNKj4b963voxs", |
| | "WBTC": "3NZ9JMVBmGAqocybic2c7LQCJScmgsAZ6vQqTDzcqmJh", |
| | "ETH": "7vfCXTUXx5WJV5JADk17DUJ4ksgau7utNKj4b963voxs", |
| | "BTC": "3NZ9JMVBmGAqocybic2c7LQCJScmgsAZ6vQqTDzcqmJh", |
| | } |
| |
|
| | |
| | ETHEREUM_TOKENS = { |
| | "ETH": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", |
| | "WETH": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", |
| | "USDC": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", |
| | "USDT": "0xdAC17F958D2ee523a2206206994597C13D831ec7", |
| | "DAI": "0x6B175474E89094C44Da98b954EescdeCB5BE3830", |
| | "WBTC": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", |
| | "UNI": "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984", |
| | "LINK": "0x514910771AF9Ca656af840dff83E8264EcF986CA", |
| | "AAVE": "0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9", |
| | "PEPE": "0x6982508145454Ce325dDbE47a25d4ec3d2311933", |
| | "SHIB": "0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE", |
| | "TRUMP": "0x576e2BeD8F7b46D34016198911Cdf9886f78bea7", |
| | } |
| |
|
| | |
| | BSC_TOKENS = { |
| | "BNB": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", |
| | "WBNB": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", |
| | "USDC": "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d", |
| | "USDT": "0x55d398326f99059fF775485246999027B3197955", |
| | "BUSD": "0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56", |
| | "CAKE": "0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82", |
| | "DOGE": "0xbA2aE424d960c26247Dd6c32edC70B295c744C43", |
| | "SHIB": "0x2859e4544C4bB03966803b044A93563Bd2D0DD4D", |
| | "FLOKI": "0xfb5B838b6cfEEdC2873aB27866079AC55363D37E", |
| | } |
| |
|
| | |
| | BASE_TOKENS = { |
| | "ETH": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", |
| | "WETH": "0x4200000000000000000000000000000000000006", |
| | "USDC": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", |
| | "DAI": "0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb", |
| | "BRETT": "0x532f27101965dd16442E59d40670FaF5eBB142E4", |
| | "DEGEN": "0x4ed4E862860beD51a9570b96d89aF5E1B0Efefed", |
| | "TOSHI": "0xAC1Bd2486aAf3B5C0fc3Fd868558b082a531B2B4", |
| | } |
| |
|
| | |
| | ALL_TOKENS = { |
| | "solana": SOLANA_TOKENS, |
| | "ethereum": ETHEREUM_TOKENS, |
| | "bsc": BSC_TOKENS, |
| | "base": BASE_TOKENS, |
| | } |
| |
|
| | |
| | SUPPORTED_CHAINS = ["solana", "ethereum", "bsc", "base"] |
| |
|
| | |
| | DEFAULT_CHAIN = "solana" |
| |
|
| |
|
| | |
| | |
| | |
| |
|
| | def get_system_prompt(chain: str = "solana") -> str: |
| | """ |
| | Build a system prompt that contains the token mapping for a chain. |
| | |
| | Args: |
| | chain: blockchain name |
| | |
| | Returns: |
| | system prompt string |
| | """ |
| | tokens = ALL_TOKENS.get(chain, SOLANA_TOKENS) |
| | |
| | |
| | token_list = [] |
| | for symbol, address in tokens.items(): |
| | token_list.append(f" - {symbol}: {address}") |
| | token_mapping_str = "\n".join(token_list) |
| | |
| | system_prompt = f"""You are a blockchain trading assistant that helps users search for tokens and execute swaps. |
| | |
| | ## Available Tools |
| | |
| | 1. **SEARCH_TOKEN**: Search for token information on the blockchain. |
| | - Parameters: symbol, address, chain, keyword |
| | - Use when user wants to find/query/search token information |
| | |
| | 2. **EXECUTE_SWAP**: Execute a token swap on the blockchain. |
| | - Parameters: inputTokenCA, outputTokenCA, inputTokenAmount, inputTokenPercentage |
| | - Use when user wants to buy/sell/swap/convert tokens |
| | |
| | ## Token Address Mapping ({chain.upper()}) |
| | |
| | {token_mapping_str} |
| | |
| | ## Important Rules |
| | |
| | 1. When user mentions a token symbol (like SOL, USDC, RAY), use the corresponding contract address from the mapping above. |
| | 2. For buying tokens: inputTokenCA is what user spends (usually SOL/ETH), outputTokenCA is what user receives. |
| | 3. For selling tokens: inputTokenCA is what user sells, outputTokenCA is usually SOL/ETH. |
| | 4. If user specifies an amount, use inputTokenAmount. If user specifies a percentage (like "all", "50%", "half"), use inputTokenPercentage. |
| | 5. inputTokenPercentage should be a decimal between 0 and 1 (e.g., 0.5 for 50%, 1.0 for 100%). |
| | 6. If the user's request is unclear or missing required information, ask for clarification instead of making assumptions. |
| | 7. Do NOT call any function if the request is unrelated to token search or swap (e.g., weather, greetings, jokes). |
| | |
| | ## Examples |
| | |
| | - "Buy 2 SOL of RAY" → EXECUTE_SWAP with inputTokenCA=SOL address, outputTokenCA=RAY address, inputTokenAmount="2" |
| | - "Sell all my JUP" → EXECUTE_SWAP with inputTokenCA=JUP address, outputTokenCA=SOL address, inputTokenPercentage=1.0 |
| | - "Search for BONK" → SEARCH_TOKEN with symbol="BONK", chain="{chain}" |
| | """ |
| | |
| | return system_prompt |
| |
|
| |
|
| | |
| | def get_system_prompt_short(chain: str = "solana") -> str: |
| | """Build the concise system prompt.""" |
| | tokens = ALL_TOKENS.get(chain, SOLANA_TOKENS) |
| | |
| | |
| | common_tokens = ["SOL", "USDC", "USDT", "RAY", "JUP", "BONK", "WIF", "TRUMP", "POPCAT", "PEPE", "ETH", "WETH", "BTC", "WBTC"] |
| | token_list = [] |
| | for symbol in common_tokens: |
| | if symbol in tokens: |
| | token_list.append(f"{symbol}:{tokens[symbol]}") |
| | token_mapping_str = ", ".join(token_list) |
| | |
| | system_prompt = f"""You are a blockchain trading assistant. Use SEARCH_TOKEN to find tokens and EXECUTE_SWAP to trade tokens. |
| | |
| | Token addresses ({chain}): {token_mapping_str} |
| | |
| | Rules: |
| | - For buy: inputTokenCA=payment token, outputTokenCA=target token |
| | - For sell: inputTokenCA=token to sell, outputTokenCA=SOL/ETH |
| | - Use inputTokenAmount for specific amounts, inputTokenPercentage (0-1) for percentages |
| | - Ask for clarification if request is unclear |
| | - Do NOT call functions for unrelated requests (weather, greetings, etc.) |
| | """ |
| | |
| | return system_prompt |
| |
|
| |
|
| | |
| | |
| | |
| |
|
| | TOOLS = [ |
| | { |
| | "type": "function", |
| | "function": { |
| | "name": "SEARCH_TOKEN", |
| | "description": "Search for token information on the blockchain. Use this when user wants to find, query, or get information about a token.", |
| | "parameters": { |
| | "type": "object", |
| | "properties": { |
| | "symbol": { |
| | "type": ["string", "null"], |
| | "description": "Symbol of the token (e.g., SOL, USDC, RAY)" |
| | }, |
| | "address": { |
| | "type": ["string", "null"], |
| | "description": "Contract address of the token" |
| | }, |
| | "chain": { |
| | "type": "string", |
| | "enum": ["solana", "ethereum", "bsc", "base"], |
| | "description": "Blockchain to search on" |
| | }, |
| | "keyword": { |
| | "type": ["string", "null"], |
| | "description": "Keyword to search for the token" |
| | } |
| | }, |
| | "required": [] |
| | } |
| | } |
| | }, |
| | { |
| | "type": "function", |
| | "function": { |
| | "name": "EXECUTE_SWAP", |
| | "description": "Execute a token swap on the blockchain. Use this when user wants to buy, sell, swap, or convert tokens.", |
| | "parameters": { |
| | "type": "object", |
| | "properties": { |
| | "inputTokenCA": { |
| | "type": ["string", "null"], |
| | "description": "Contract address of the token to spend/sell" |
| | }, |
| | "outputTokenCA": { |
| | "type": ["string", "null"], |
| | "description": "Contract address of the token to receive/buy" |
| | }, |
| | "inputTokenAmount": { |
| | "type": ["string", "null"], |
| | "description": "Exact amount of input token to swap" |
| | }, |
| | "inputTokenPercentage": { |
| | "type": ["number", "null"], |
| | "description": "Percentage of input token balance to swap (0-1, e.g., 0.5 for 50%)" |
| | } |
| | }, |
| | "required": ["inputTokenCA", "outputTokenCA"] |
| | } |
| | } |
| | } |
| | ] |
| |
|
| |
|
| | |
| | |
| | |
| |
|
| | def get_token_address(symbol: str, chain: str = "solana") -> str: |
| | """Get token address by symbol.""" |
| | tokens = ALL_TOKENS.get(chain, SOLANA_TOKENS) |
| | return tokens.get(symbol.upper(), None) |
| |
|
| |
|
| | def get_native_token(chain: str = "solana") -> tuple: |
| | """Get the native token (symbol, address) for a chain.""" |
| | native_tokens = { |
| | "solana": ("SOL", SOLANA_TOKENS["SOL"]), |
| | "ethereum": ("ETH", ETHEREUM_TOKENS["ETH"]), |
| | "bsc": ("BNB", BSC_TOKENS["BNB"]), |
| | "base": ("ETH", BASE_TOKENS["ETH"]), |
| | } |
| | return native_tokens.get(chain, ("SOL", SOLANA_TOKENS["SOL"])) |
| |
|
| |
|
| | def get_all_token_symbols(chain: str = "solana") -> list: |
| | """Return all token symbols on a chain.""" |
| | tokens = ALL_TOKENS.get(chain, SOLANA_TOKENS) |
| | return list(tokens.keys()) |
| |
|
| |
|
| | if __name__ == "__main__": |
| | |
| | print("=== System Prompt (Full) ===") |
| | print(get_system_prompt("solana")[:500] + "...") |
| | print("\n=== System Prompt (Short) ===") |
| | print(get_system_prompt_short("solana")) |
| | print("\n=== Token Address ===") |
| | print(f"RAY: {get_token_address('RAY', 'solana')}") |
| | print(f"TRUMP: {get_token_address('TRUMP', 'solana')}") |
| |
|