# Get Liquidity Details of a Pool

We will fetch a pool's parsed info and understand how much tokens are present in the pool. This will also require us to query <mark style="color:yellow;">OpenBook</mark> through RPC. We will also fetch pricing info for the tokens involved using Jup API and find the total liquidity value of the pool.

{% hint style="success" %}
You can also check pool's LP burnt percentage [with this example](/solana-indexers/case-studies/raydium/get-pool-burn-percentage.md).
{% endhint %}

{% code overflow="wrap" fullWidth="false" %}

```typescript
import { Connection, PublicKey } from "@solana/web3.js";
import { OpenOrders } from "@project-serum/serum";
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 queryLpByAddress(address:string) {
  // We only fetch fields necessary for us
  const query = gql`
    query MyQuery($where: Raydium_LiquidityPoolv4_bool_exp) {
  Raydium_LiquidityPoolv4(
    where: {pubkey: {_eq: ${JSON.stringify(address)}}}
  ) {
    baseDecimal
    baseMint
    baseNeedTakePnl
    baseVault
    marketId
    marketProgramId
    openOrders
    quoteDecimal
    quoteMint
    quoteNeedTakePnl
    quoteVault
  }
}`;

  return await graphQLClient.request(query);
}

//We have to check how much tokens are present in openbook market as well
export async function parsePoolInfo(poolInfo) {
  const OPENBOOK_PROGRAM_ID = new PublicKey(
    "srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX"
  );

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

  const openOrders = await OpenOrders.load(
    connection,
    new PublicKey(poolInfo.openOrders),
    OPENBOOK_PROGRAM_ID
  );

  const baseDecimal = 10 ** poolInfo.baseDecimal; // e.g. 10 ^ 6
  const quoteDecimal = 10 ** poolInfo.quoteDecimal;

  const baseTokenAmount = await connection.getTokenAccountBalance(
    new PublicKey(poolInfo.baseVault)
  );
  const quoteTokenAmount = await connection.getTokenAccountBalance(
    new PublicKey(poolInfo.quoteVault)
  );

  const basePnl = poolInfo.baseNeedTakePnl / baseDecimal;
  const quotePnl = poolInfo.quoteNeedTakePnl / quoteDecimal;

  const openOrdersBaseTokenTotal =
    openOrders.baseTokenTotal / baseDecimal;
  const openOrdersQuoteTokenTotal =
    openOrders.quoteTokenTotal / quoteDecimal;

  const base =
    (baseTokenAmount.value?.uiAmount || 0) + openOrdersBaseTokenTotal - basePnl;
  const quote =
    (quoteTokenAmount.value?.uiAmount || 0) +
    openOrdersQuoteTokenTotal -
    quotePnl;

  console.log(
    "Pool info:",
    "\n base tokens in pool " + base,
    "\n quote tokens in pool " + quote,
  );

  //Get the price of the tokens
  //We are using Jup pricing APIs, you can use whichever you want
  const priceInfo = await getTokenPrices(poolInfo.baseMint, poolInfo.quoteMint);
  const baseLiquidity = base * priceInfo.basePrice;
  const quoteLiquidity = quote * 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 queryLpByAddress('HVNwzt7Pxfu76KHCMQPTLuTCLTm6WnQ1esLv4eizseSv');
await parsePoolInfo(poolInfo.Raydium_LiquidityPoolv4[0])
```

{% endcode %}

#### Get Tokens Present In Pool

Sometimes you only need to know how much base and quote tokens are present in the pool. This code snippet tells you how to do it. It is same as above, without the Jup pricing info.

```typescript
import { Connection, PublicKey } from "@solana/web3.js";
import { OpenOrders } from "@project-serum/serum";
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 queryLpByAddress(address:string) {
  // We only fetch fields necessary for us
  const query = gql`
    query MyQuery($where: Raydium_LiquidityPoolv4_bool_exp) {
  Raydium_LiquidityPoolv4(
    where: {pubkey: {_eq: ${JSON.stringify(address)}}}
  ) {
    baseDecimal
    baseMint
    baseNeedTakePnl
    baseVault
    marketId
    marketProgramId
    openOrders
    quoteDecimal
    quoteMint
    quoteNeedTakePnl
    quoteVault
  }
}`;

  return await graphQLClient.request(query);
}

//We have to check how much tokens are present in openbook market as well
export async function parsePoolInfo(poolInfo) {
  const OPENBOOK_PROGRAM_ID = new PublicKey(
    "srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX"
  );

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

  const openOrders = await OpenOrders.load(
    connection,
    new PublicKey(poolInfo.openOrders),
    OPENBOOK_PROGRAM_ID
  );

  const baseDecimal = 10 ** poolInfo.baseDecimal; // e.g. 10 ^ 6
  const quoteDecimal = 10 ** poolInfo.quoteDecimal;

  const baseTokenAmount = await connection.getTokenAccountBalance(
    new PublicKey(poolInfo.baseVault)
  );
  const quoteTokenAmount = await connection.getTokenAccountBalance(
    new PublicKey(poolInfo.quoteVault)
  );

  const basePnl = poolInfo.baseNeedTakePnl / baseDecimal;
  const quotePnl = poolInfo.quoteNeedTakePnl / quoteDecimal;

  const openOrdersBaseTokenTotal =
    openOrders.baseTokenTotal / baseDecimal;
  const openOrdersQuoteTokenTotal =
    openOrders.quoteTokenTotal / quoteDecimal;

  const base =
    (baseTokenAmount.value?.uiAmount || 0) + openOrdersBaseTokenTotal - basePnl;
  const quote =
    (quoteTokenAmount.value?.uiAmount || 0) +
    openOrdersQuoteTokenTotal -
    quotePnl;

  console.log(
    "Pool info:",
    "\n Base tokens in pool " + base,
    "\n Quote tokens in pool " + quote,
  );
}

//This is bonk-usdc pool addres
const poolInfo = await queryLpByAddress('HVNwzt7Pxfu76KHCMQPTLuTCLTm6WnQ1esLv4eizseSv');
await parsePoolInfo(poolInfo.Raydium_LiquidityPoolv4[0])
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.shyft.to/solana-indexers/case-studies/raydium/get-liquidity-details-of-a-pool.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
