UNPKG

orca-clmm-agent

Version:

Orca Whirlpool clmm library for automated position management

61 lines (60 loc) 2.94 kB
"use strict"; // exportFullLiquidity.ts var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const fs_1 = __importDefault(require("fs")); const dotenv_1 = __importDefault(require("dotenv")); const kit_1 = require("@solana/kit"); const whirlpools_client_1 = require("@orca-so/whirlpools-client"); const whirlpools_1 = require("@orca-so/whirlpools"); const orca_1 = require("../orca"); // your helper to fetch pool data const whirlpools_core_1 = require("@orca-so/whirlpools-core"); const kit_2 = require("@solana/kit"); dotenv_1.default.config(); async function main() { const rpcUrl = process.env.RPC_URL; if (!rpcUrl) throw new Error("RPC_URL must be set in .env"); const rpc = (0, kit_1.createSolanaRpc)((0, kit_1.mainnet)(rpcUrl)); await (0, whirlpools_1.setWhirlpoolsConfig)("solanaMainnet"); // configure your pool address and desired window (e.g. ±40%) const poolAddress = (0, kit_2.address)("Czfq3xZZDmsdGdUyrNLtRhGc47cXcZtLG4crryfu44zE"); const temp = await (0, orca_1.getLiquidityInTicks)({ poolAddress, rpc }); // fetch on‐chain Whirlpool data const whirlpool = await (0, orca_1.fetchOrcaPoolByAddress)(poolAddress); const pool = await (0, orca_1.getOnChainPool)(whirlpool, rpc); const currentPrice = +pool.price; const { tokenA, tokenB, tickCurrentIndex, tickSpacing } = whirlpool; // compute price window const priceNow = (0, whirlpools_core_1.tickIndexToPrice)(tickCurrentIndex, tokenA.decimals, tokenB.decimals); // fetch all tick arrays for this pool const filter = (0, whirlpools_client_1.fixedTickArrayWhirlpoolFilter)(poolAddress); const tickArrays = await (0, whirlpools_client_1.fetchAllFixedTickArrayWithFilter)(rpc, filter); tickArrays.sort((a, b) => a.data.startTickIndex - b.data.startTickIndex); // sweep liquidity using liquidityNet const fullData = []; let liquidity = 0n; for (const ta of tickArrays) { const { startTickIndex, ticks } = ta.data; for (let i = 0; i < ticks.length; i++) { const tickIndex = startTickIndex + i * tickSpacing; const tick = ticks[i]; if (!tick.initialized) continue; liquidity += BigInt(tick.liquidityNet); const price = (0, whirlpools_core_1.tickIndexToPrice)(tickIndex, tokenA.decimals, tokenB.decimals); fullData.push({ tickIndex, price, liquidity: Number(liquidity) }); } } // write out JSON file const outPath = "./examples/points.json"; const out = { currentPrice, data: fullData }; fs_1.default.writeFileSync(outPath, JSON.stringify(out, null, 2)); console.log(`Exported ${fullData.length} entries to ${outPath}`); } main().catch((err) => { console.error(err); process.exit(1); });