UNPKG

@gala-chain/launchpad-mcp-server

Version:

MCP server for Gala Launchpad - 102 tools (pool management, event watchers, GSwap DEX trading, price history, token creation, wallet management, DEX pool discovery, liquidity positions, token locks, locked token queries, composite pool data, cross-chain b

549 lines 23.5 kB
"use strict"; /** * DEX/GalaSwap Trading Operations Tools & Pool Discovery * * Tools for trading on GalaSwap DEX after tokens graduate from bonding curves, * discovering liquidity pools, and managing positions. * Provides quote generation, swap execution, liquidity management, asset management, and pool exploration. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.dexTools = exports.fetchAllAvailableDexTokensTool = exports.fetchAvailableDexTokensTool = exports.getAllSwapUserAssetsTool = exports.getSwapPoolPriceTool = exports.calculateDexPoolQuoteExternalTool = exports.calculateDexPoolQuoteLocalTool = exports.fetchCompositePoolDataTool = exports.getSwapPoolInfoTool = exports.getSwapUserAssetsTool = exports.executeSwapTool = exports.getSwapQuoteExactOutputTool = exports.getSwapQuoteExactInputTool = void 0; const liquidity_positions_js_1 = require("./liquidity-positions.js"); const fetchDexPools_js_1 = require("./fetchDexPools.js"); const fetchAllDexPools_js_1 = require("./fetchAllDexPools.js"); const leaderboard_js_1 = require("./leaderboard.js"); const volume_js_1 = require("./volume.js"); const response_formatter_js_1 = require("../../utils/response-formatter.js"); const error_handler_js_1 = require("../../utils/error-handler.js"); const common_schemas_js_1 = require("../../schemas/common-schemas.js"); // Token symbol for DEX trading const TOKEN_SYMBOL_SCHEMA = { type: 'string', minLength: 1, maxLength: 20, description: 'Token symbol (e.g., "GALA", "GUSDC")', }; // Fee tier for GalaSwap (in basis points) const FEE_TIER_SCHEMA = { type: 'number', enum: [500, 3000, 10000], description: 'Fee tier in basis points: 500 (0.05%), 3000 (0.30%), 10000 (1.00%)', }; // Slippage tolerance const SLIPPAGE_TOLERANCE_SCHEMA = { type: 'number', minimum: 0, maximum: 1, description: 'Slippage tolerance as decimal (e.g., 0.01 for 1%)', }; // 1. Get Swap Quote (Exact Input) exports.getSwapQuoteExactInputTool = { name: 'gala_launchpad_get_swap_quote_exact_input', description: 'Get swap quote for exact input amount - specify how much you want to spend', inputSchema: { type: 'object', properties: { fromToken: TOKEN_SYMBOL_SCHEMA, toToken: TOKEN_SYMBOL_SCHEMA, amount: { ...common_schemas_js_1.DECIMAL_AMOUNT_SCHEMA, description: 'Amount of source token to spend', }, }, required: ['fromToken', 'toToken', 'amount'], }, handler: (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => { const quote = await sdk.getSwapQuoteExactInput(args.fromToken, args.toToken, args.amount); return (0, response_formatter_js_1.formatSuccess)({ fromToken: quote.fromToken, toToken: quote.toToken, inputAmount: quote.inputAmount, estimatedOutput: quote.estimatedOutput, feeTier: quote.feeTier, priceImpact: quote.priceImpact, executionPrice: quote.executionPrice, message: `Spending ${quote.inputAmount} ${quote.fromToken}, receiving ~${quote.estimatedOutput} ${quote.toToken}`, }); }), }; // 2. Get Swap Quote (Exact Output) exports.getSwapQuoteExactOutputTool = { name: 'gala_launchpad_get_swap_quote_exact_output', description: 'Get swap quote for exact output amount - specify how much you want to receive', inputSchema: { type: 'object', properties: { fromToken: TOKEN_SYMBOL_SCHEMA, toToken: TOKEN_SYMBOL_SCHEMA, amount: { ...common_schemas_js_1.DECIMAL_AMOUNT_SCHEMA, description: 'Desired amount of destination token to receive', }, }, required: ['fromToken', 'toToken', 'amount'], }, handler: (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => { const quote = await sdk.getSwapQuoteExactOutput(args.fromToken, args.toToken, args.amount); return (0, response_formatter_js_1.formatSuccess)({ fromToken: quote.fromToken, toToken: quote.toToken, inputAmount: quote.inputAmount, estimatedOutput: quote.estimatedOutput, feeTier: quote.feeTier, priceImpact: quote.priceImpact, executionPrice: quote.executionPrice, message: `Spending ~${quote.inputAmount} ${quote.fromToken}, receiving ${quote.estimatedOutput} ${quote.toToken}`, }); }), }; // 3. Execute Swap exports.executeSwapTool = { name: 'gala_launchpad_execute_swap', description: 'Execute a token swap on GalaSwap DEX with slippage protection. Get a quote first using getSwapQuote tools.', inputSchema: { type: 'object', properties: { fromToken: TOKEN_SYMBOL_SCHEMA, toToken: TOKEN_SYMBOL_SCHEMA, inputAmount: { ...common_schemas_js_1.DECIMAL_AMOUNT_SCHEMA, description: 'Amount of source token to spend', }, estimatedOutput: { ...common_schemas_js_1.DECIMAL_AMOUNT_SCHEMA, description: 'Expected output amount from quote (for slippage calculation)', }, feeTier: FEE_TIER_SCHEMA, slippageTolerance: { ...SLIPPAGE_TOLERANCE_SCHEMA, default: 0.01, }, }, required: ['fromToken', 'toToken', 'inputAmount', 'estimatedOutput', 'feeTier'], }, handler: (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => { // Validate wallet before execution by trying to get address try { sdk.getAddress(); } catch { throw new Error('Wallet not configured - required for swap execution'); } const result = await sdk.executeSwap(args.fromToken, args.toToken, args.inputAmount, args.estimatedOutput, args.feeTier, args.slippageTolerance || 0.01); return (0, response_formatter_js_1.formatSuccess)({ transactionId: result.transactionId, status: result.status, fromToken: result.fromToken, toToken: result.toToken, inputAmount: result.inputAmount, outputAmount: result.outputAmount, feeTier: result.feeTier, slippageTolerance: result.slippageTolerance, timestamp: result.timestamp.toISOString(), message: `Swap completed! Sent ${result.inputAmount} ${result.fromToken}, received ${result.outputAmount} ${result.toToken}`, }); }), }; // 4. Get User Assets (with rich metadata) exports.getSwapUserAssetsTool = { name: 'gala_launchpad_get_swap_user_assets', description: 'Get all token assets and balances for a wallet address with rich metadata (image, name, description)', inputSchema: { type: 'object', properties: { walletAddress: { ...common_schemas_js_1.ADDRESS_SCHEMA, description: 'Wallet address to query (e.g., "0x1234..." or "eth|1234...")', }, }, required: ['walletAddress'], }, handler: (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => { const assets = await sdk.getSwapUserAssets(args.walletAddress); return (0, response_formatter_js_1.formatSuccess)({ walletAddress: args.walletAddress, assetCount: assets.length, assets: assets.map((asset) => ({ symbol: asset.symbol, name: asset.name, description: asset.description, image: asset.image, balance: asset.balance, decimals: asset.decimals, verified: asset.verified, compositeKey: asset.compositeKey, })), message: `${assets.length} assets found for wallet ${args.walletAddress}`, }); }), }; // 5. Get Pool Info exports.getSwapPoolInfoTool = { name: 'gala_launchpad_get_swap_pool_info', description: 'Get liquidity and fee tier information for a token pair on GalaSwap DEX', inputSchema: { type: 'object', properties: { tokenA: TOKEN_SYMBOL_SCHEMA, tokenB: TOKEN_SYMBOL_SCHEMA, }, required: ['tokenA', 'tokenB'], }, handler: (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => { const poolInfo = await sdk.getSwapPoolInfo(args.tokenA, args.tokenB); return (0, response_formatter_js_1.formatSuccess)({ tokenA: poolInfo.tokenA, tokenB: poolInfo.tokenB, liquidity: poolInfo.liquidity, feeTiers: poolInfo.feeTiers, feeTiersFormatted: poolInfo.feeTiers.map((tier) => `${tier / 100}%`), swapCount: poolInfo.swapCount, message: `Pool ${args.tokenA}/${args.tokenB} has ${poolInfo.liquidity} liquidity with ${poolInfo.feeTiers.length} fee tiers`, }); }), }; // Token class key for DEX (full pipe-delimited format) const TOKEN_CLASS_KEY_SCHEMA = { type: 'string', description: 'Full token class key in pipe-delimited format (e.g., "GALA|Unit|none|none" or "Token|Unit|SYMBOL|client:xxx")', }; // 6. Fetch Composite Pool Data exports.fetchCompositePoolDataTool = { name: 'gala_launchpad_fetch_composite_pool_data', description: 'Fetch complete pool state for offline DEX quote calculations. Returns pool liquidity, tick data, and token balances. Use this for bulk pricing operations or when you need multiple quotes for the same pool.', inputSchema: { type: 'object', properties: { token0: { ...TOKEN_CLASS_KEY_SCHEMA, description: 'First token class key (e.g., "GALA|Unit|none|none")', }, token1: { ...TOKEN_CLASS_KEY_SCHEMA, description: 'Second token class key (e.g., "Token|Unit|BENE|client:5c806869e7fd0e2384461ce9")', }, fee: FEE_TIER_SCHEMA, }, required: ['token0', 'token1', 'fee'], }, handler: (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => { const composite = await sdk.fetchCompositePoolData({ token0: args.token0, token1: args.token1, fee: args.fee, }); return (0, response_formatter_js_1.formatSuccess)({ token0: args.token0, token1: args.token1, fee: args.fee, token0Decimals: composite.token0Decimals, token1Decimals: composite.token1Decimals, poolLiquidity: composite.pool.liquidity.toString(), tick: composite.pool.tick, sqrtPrice: composite.pool.sqrtPrice.toString(), tickDataCount: Object.keys(composite.tickDataMap).length, message: `Composite pool data fetched for ${args.token0}/${args.token1} (${args.fee / 10000}% fee)`, }); }), }; // 7. Calculate DEX Pool Quote (Local - instant offline calculation) exports.calculateDexPoolQuoteLocalTool = { name: 'gala_launchpad_calculate_dex_pool_quote_local', description: 'Calculate instant DEX quote using local bonding curve math. Auto-fetches pool data unless compositePoolData is provided (for bulk efficiency).', inputSchema: { type: 'object', properties: { token0: { ...TOKEN_CLASS_KEY_SCHEMA, description: 'First token in pool (e.g., "GALA|Unit|none|none")', }, token1: { ...TOKEN_CLASS_KEY_SCHEMA, description: 'Second token in pool (e.g., "Token|Unit|BENE|client:xxx")', }, fee: FEE_TIER_SCHEMA, fromToken: { ...TOKEN_CLASS_KEY_SCHEMA, description: 'Token to swap FROM', }, toToken: { ...TOKEN_CLASS_KEY_SCHEMA, description: 'Token to swap TO', }, amount: { ...common_schemas_js_1.DECIMAL_AMOUNT_SCHEMA, description: 'Amount of fromToken to swap', }, compositePoolData: { type: 'string', description: 'Optional: Pre-fetched composite pool data as JSON string from gala_launchpad_fetch_composite_pool_data. If provided, skips fetch for efficiency (ideal for bulk quotes).', }, }, required: ['token0', 'token1', 'fee', 'fromToken', 'toToken', 'amount'], }, handler: (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => { // Use provided composite data or fetch it let composite; if (args.compositePoolData) { composite = JSON.parse(args.compositePoolData); } else { composite = await sdk.fetchCompositePoolData({ token0: args.token0, token1: args.token1, fee: args.fee, }); } // Calculate quote locally const quote = await sdk.calculateDexPoolQuoteExactAmountLocal({ compositePoolData: composite, fromToken: args.fromToken, toToken: args.toToken, amount: args.amount, }); return (0, response_formatter_js_1.formatSuccess)({ mode: 'local', fromToken: args.fromToken, toToken: args.toToken, inputAmount: quote.amount0, outputAmount: quote.amount1, currentSqrtPrice: quote.currentSqrtPrice, newSqrtPrice: quote.newSqrtPrice, priceImpact: quote.priceImpact, executionPrice: quote.executionPrice, usedCachedData: !!args.compositePoolData, message: `Local quote: ${quote.amount0} ${args.fromToken} ${quote.amount1} ${args.toToken}${args.compositePoolData ? ' (using cached pool data)' : ''}`, }); }), }; // 8. Calculate DEX Pool Quote (External - real-time from blockchain) exports.calculateDexPoolQuoteExternalTool = { name: 'gala_launchpad_calculate_dex_pool_quote_external', description: 'Calculate real-time DEX quote from GalaChain blockchain. Slower than local but always reflects current pool state. Use for final price verification.', inputSchema: { type: 'object', properties: { token0: { ...TOKEN_CLASS_KEY_SCHEMA, description: 'First token in pool (e.g., "GALA|Unit|none|none")', }, token1: { ...TOKEN_CLASS_KEY_SCHEMA, description: 'Second token in pool (e.g., "Token|Unit|BENE|client:xxx")', }, fee: FEE_TIER_SCHEMA, fromToken: { ...TOKEN_CLASS_KEY_SCHEMA, description: 'Token to swap FROM', }, toToken: { ...TOKEN_CLASS_KEY_SCHEMA, description: 'Token to swap TO', }, amount: { ...common_schemas_js_1.DECIMAL_AMOUNT_SCHEMA, description: 'Amount of fromToken to swap', }, }, required: ['token0', 'token1', 'fee', 'fromToken', 'toToken', 'amount'], }, handler: (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => { // Fetch composite pool data first const composite = await sdk.fetchCompositePoolData({ token0: args.token0, token1: args.token1, fee: args.fee, }); // Calculate quote from blockchain const quote = await sdk.calculateDexPoolQuoteExactAmountExternal({ compositePoolData: composite, fromToken: args.fromToken, toToken: args.toToken, amount: args.amount, }); return (0, response_formatter_js_1.formatSuccess)({ mode: 'external', fromToken: args.fromToken, toToken: args.toToken, inputAmount: quote.amount0, outputAmount: quote.amount1, currentSqrtPrice: quote.currentSqrtPrice, newSqrtPrice: quote.newSqrtPrice, priceImpact: quote.priceImpact, executionPrice: quote.executionPrice, message: `External quote: ${quote.amount0} ${args.fromToken} ${quote.amount1} ${args.toToken}`, }); }), }; // 9. Get Swap Pool Price exports.getSwapPoolPriceTool = { name: 'gala_launchpad_get_swap_pool_price', description: 'Get current price, tick, and liquidity for a DEX pool. Use to check if liquidity positions are in-range.', inputSchema: { type: 'object', properties: { token0: TOKEN_SYMBOL_SCHEMA, token1: TOKEN_SYMBOL_SCHEMA, fee: FEE_TIER_SCHEMA, }, required: ['token0', 'token1', 'fee'], }, handler: (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => { const priceData = await sdk.getSwapPoolPrice(args.token0, args.token1, args.fee); return (0, response_formatter_js_1.formatSuccess)({ token0: args.token0, token1: args.token1, fee: args.fee, price: priceData.price, tick: priceData.tick, liquidity: priceData.liquidity, message: `Pool price: ${priceData.price} ${args.token1} per ${args.token0} (tick: ${priceData.tick})`, }); }), }; // 10. Get All Swap User Assets (auto-paginated, with rich metadata) exports.getAllSwapUserAssetsTool = { name: 'gala_launchpad_get_all_swap_user_assets', description: 'Get ALL token assets and balances for a wallet (auto-paginates) with rich metadata (image, name, description). Complete portfolio view for DEX trading.', inputSchema: { type: 'object', properties: { walletAddress: { ...common_schemas_js_1.ADDRESS_SCHEMA, description: 'Wallet address to query (e.g., "0x1234..." or "eth|1234...")', }, }, required: ['walletAddress'], }, handler: (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => { const assets = await sdk.getAllSwapUserAssets(args.walletAddress); return (0, response_formatter_js_1.formatSuccess)({ walletAddress: args.walletAddress, assetCount: assets.length, assets: assets.map((asset) => ({ symbol: asset.symbol, name: asset.name, description: asset.description, image: asset.image, balance: asset.balance, decimals: asset.decimals, verified: asset.verified, compositeKey: asset.compositeKey, })), message: `${assets.length} total assets found for wallet ${args.walletAddress} (fully paginated)`, }); }), }; // 11. Fetch Available DEX Tokens (paginated token discovery, no address required) exports.fetchAvailableDexTokensTool = { name: 'gala_launchpad_fetch_available_dex_tokens', description: 'Discover all tokens available on the DEX (paginated). Returns rich token metadata without requiring a wallet address. Use for token discovery and listing.', inputSchema: { type: 'object', properties: { search: { type: 'string', minLength: 1, maxLength: 100, description: 'Optional search query to filter tokens by name or symbol', }, limit: { type: 'number', minimum: 1, maximum: 20, description: 'Results per page (max 20, default: 20)', }, page: { type: 'number', minimum: 1, description: 'Page number (default: 1)', }, }, required: [], }, handler: (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => { const result = await sdk.fetchAvailableDexTokens({ search: args.search, limit: args.limit, page: args.page, }); return (0, response_formatter_js_1.formatSuccess)({ count: result.count, page: result.page, limit: result.limit, hasMore: result.hasMore, tokens: result.tokens.map((token) => ({ symbol: token.symbol, name: token.name, description: token.description, image: token.image, decimals: token.decimals, verified: token.verified, compositeKey: token.compositeKey, category: token.category, type: token.type, collection: token.collection, })), message: `Found ${result.tokens.length} tokens (page ${result.page}, ${result.count} total)${result.hasMore ? ' - more pages available' : ''}`, }); }), }; // 12. Fetch All Available DEX Tokens (auto-paginated token discovery) exports.fetchAllAvailableDexTokensTool = { name: 'gala_launchpad_fetch_all_available_dex_tokens', description: 'Discover ALL tokens available on the DEX (auto-paginates). Returns complete list with rich metadata. Use for comprehensive token catalogs.', inputSchema: { type: 'object', properties: { search: { type: 'string', minLength: 1, maxLength: 100, description: 'Optional search query to filter tokens by name or symbol', }, }, required: [], }, handler: (0, error_handler_js_1.withErrorHandling)(async (sdk, args) => { const tokens = await sdk.fetchAllAvailableDexTokens({ search: args.search, }); return (0, response_formatter_js_1.formatSuccess)({ tokenCount: tokens.length, tokens: tokens.map((token) => ({ symbol: token.symbol, name: token.name, description: token.description, image: token.image, decimals: token.decimals, verified: token.verified, compositeKey: token.compositeKey, category: token.category, type: token.type, collection: token.collection, })), message: `Found ${tokens.length} total tokens available on the DEX`, }); }), }; // Export all DEX tools (2 pool discovery + 4 leaderboard + 1 volume + 12 swap/quote/token tools + 9 liquidity position tools = 28 tools) exports.dexTools = [ fetchDexPools_js_1.fetchDexPoolsTool, fetchAllDexPools_js_1.fetchAllDexPoolsTool, exports.getSwapQuoteExactInputTool, exports.getSwapQuoteExactOutputTool, exports.executeSwapTool, exports.getSwapUserAssetsTool, exports.getSwapPoolInfoTool, exports.fetchCompositePoolDataTool, exports.calculateDexPoolQuoteLocalTool, exports.calculateDexPoolQuoteExternalTool, exports.getSwapPoolPriceTool, exports.getAllSwapUserAssetsTool, exports.fetchAvailableDexTokensTool, exports.fetchAllAvailableDexTokensTool, ...leaderboard_js_1.leaderboardTools, ...volume_js_1.volumeTools, ...liquidity_positions_js_1.liquidityPositionTools, ]; //# sourceMappingURL=index.js.map