Get Liquidity Details of a Pool

Get Liquidity present in an Orca pool.

We often want to fetch how much liquidity is present in a pool. To achieve this,

  • We fetch pool info using graphQL APIs either by pool pubkey or token address.

  • We fetch tokenVaultA and tokenVaultB token balances, to see how much tokens are present in the pool.

  • For the pooled tokens we fetch their prices through any Pricing API of choice.

You can directly run this code in replit to see it in action

import { Connection, PublicKey } from "@solana/web3.js";
import { gql, GraphQLClient } from "graphql-request";

const SHYFT_API_KEY = 'YOUR-KEY';

const graphQLEndpoint = `https://programs.shyft.to/v0/graphql/?api_key=${SHYFT_API_KEY}`;
const rpcEndpoint = `https://rpc.shyft.to/?api_key=${SHYFT_API_KEY}`;

const graphQLClient = new GraphQLClient(graphQLEndpoint, {
  method: `POST`,
  jsonSerializer: {
    parse: JSON.parse,
    stringify: JSON.stringify,
  },
});

async function queryOrcaPool(address:string) {
  // We only fetch fields necessary for us
  const query = gql`
    query MyQuery {
  ORCA_WHIRLPOOLS_whirlpool(
    where: {pubkey: {_eq: ${JSON.stringify(address)}}}
  ) {
    pubkey
    feeGrowthGlobalA
    feeGrowthGlobalB
    feeRate
    liquidity
    protocolFeeOwedA
    protocolFeeOwedB
    protocolFeeRate
    rewardLastUpdatedTimestamp
    sqrtPrice
    tickCurrentIndex
    tickSpacing
    tokenMintA
    tokenMintB
    tokenVaultA
    tokenVaultB
    whirlpoolsConfig
  }
}`;

  return await graphQLClient.request(query);
}

//We have to check how much tokens are present in openbook market as well
export async function parsePoolInfo(poolInfo) {

  //to load openOorders from openbook
  const connection = new Connection(rpcEndpoint, "confirmed");

  const tokenBalanceA = await connection.getTokenAccountBalance(
    new PublicKey(poolInfo.tokenVaultA)
  );
  const tokenBalanceB = await connection.getTokenAccountBalance(
    new PublicKey(poolInfo.tokenVaultB)
  );

  const tokenAmountA = tokenBalanceA.value?.uiAmount;
  const tokenAmountB = tokenBalanceB.value?.uiAmount;

  console.log(
    "Pool info:",
    "\n Token A in pool " + tokenAmountA,
    "\n Token B in pool " + tokenAmountB,
  );

  //Get the price of the tokens
  //We are using Jup pricing APIs, you can use whichever you want
  const priceInfo = await getTokenPrices(poolInfo.tokenMintA, poolInfo.tokenMintB);
  const baseLiquidity = tokenAmountA * priceInfo.basePrice;
  const quoteLiquidity = tokenAmountB * priceInfo.quotePrice;
  console.log(`Base Token liquidity: ${baseLiquidity} \n`);
  console.log(`Quote Token liquidity: ${quoteLiquidity} \n`);
  console.log(`Total liquidity in the pool: ${baseLiquidity + quoteLiquidity}`)
}

//Fetch token prices in USD using Jup pricing APIs 
async function getTokenPrices(base, quote) {
  const baseMintPrice = await (await fetch(
    `https://price.jup.ag/v4/price?ids=${base}`)).json()
  const quoteMintPrice = await (await fetch(`https://price.jup.ag/v4/price?ids=${quote}`)).json()
  console.log(quoteMintPrice)
  console.log(baseMintPrice)
  return {basePrice: baseMintPrice.data[base]?.price || 0, quotePrice: quoteMintPrice.data[quote]?.price || 0}
}

//This is bonk-usdc pool addres
const poolInfo = await queryOrcaPool('5y2jFFA3A8GNjRnVMg8LfTHbBg7y2vivopiK8LmGRP2B');
console.log(poolInfo)
console.log('Parsing Pool info')
await parsePoolInfo(poolInfo.ORCA_WHIRLPOOLS_whirlpool[0])

Last updated