UNPKG

orca-clmm-agent

Version:

Orca Whirlpool clmm library for automated position management

120 lines (119 loc) 4.66 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const express_1 = __importDefault(require("express")); const cors_1 = __importDefault(require("cors")); const whirlpools_1 = require("@orca-so/whirlpools"); const web3_js_1 = require("@solana/web3.js"); const utils_1 = require("../utils"); const dotenv = __importStar(require("dotenv")); dotenv.config(); const app = (0, express_1.default)(); const PORT = process.env.PORT || 3001; // Create RPC connection const rpcUrl = process.env.RPC_URL || 'https://api.mainnet-beta.solana.com'; const rpc = (0, web3_js_1.createSolanaRpc)((0, web3_js_1.mainnet)(rpcUrl)); // Enable CORS for all routes app.use((0, cors_1.default)()); app.use(express_1.default.json()); // Setup Orca Whirlpools configuration async function setupWhirlpools() { try { await (0, whirlpools_1.setWhirlpoolsConfig)('solanaMainnet'); console.log('Whirlpools configuration set up successfully'); } catch (error) { console.error('Error setting up Whirlpools configuration:', error); } } // Initialize the Whirlpools configuration when the server starts setupWhirlpools(); // Health check endpoint app.get('/health', (_req, res) => { res.status(200).json({ status: 'ok', timestamp: new Date().toISOString() }); }); // Get wallet tokens endpoint app.get('/tokens', async (req, res) => { try { const walletAddress = req.query.wallet; console.log('Fetching tokens for wallet:', walletAddress); if (!walletAddress) { res.status(400).json({ error: 'Wallet address is required' }); return; } // Get tokens with prices const tokens = await (0, utils_1.fetchTokensWithPrices)(walletAddress, rpcUrl); // Calculate total portfolio value const totalValue = tokens.reduce((sum, token) => sum + token.usdValue, 0); res.set('Cache-Control', 'public, max-age=3600'); // 1 hour cache res.status(200).json({ wallet: walletAddress, totalValue, tokens }); } catch (error) { console.error('Error fetching tokens:', error); res.status(500).json({ error: 'Failed to fetch tokens' }); } }); // Get positions endpoint app.get('/positions', async (req, res) => { try { const walletAddress = req.query.wallet; console.log('Fetching positions for wallet:', walletAddress); if (!walletAddress) { res.status(400).json({ error: 'Wallet address is required' }); return; } // Get positions const positions = await (0, utils_1.getDetailedPositions)(walletAddress, rpc); res.set('Cache-Control', 'public, max-age=3600'); res.status(200).json({ positions }); } catch (error) { console.error('Error fetching positions:', error); res.status(500).json({ error: 'Failed to fetch positions' }); } }); // Start the server app.listen(PORT, async () => { //define default funder (0, whirlpools_1.setDefaultFunder)(await (0, web3_js_1.generateKeyPairSigner)()); console.log(`Server running on port ${PORT}`); });