orca-clmm-agent
Version:
Orca Whirlpool clmm library for automated position management
61 lines (60 loc) • 2.94 kB
JavaScript
;
// 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);
});