Get Liquidity Details of a Pool
Fetch liquidity pool info and check how much liquidity is present.
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])Get Tokens Present In Pool
Last updated