|
|
|
|
|
""" |
|
|
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')}") |
|
|
|