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";constSHYFT_API_KEY='YOUR-KEY';constgraphQLEndpoint=`https://programs.shyft.to/v0/graphql/?api_key=${SHYFT_API_KEY}`;constrpcEndpoint=`https://rpc.shyft.to/?api_key=${SHYFT_API_KEY}`;constgraphQLClient=newGraphQLClient(graphQLEndpoint, { method:`POST`, jsonSerializer: { parse:JSON.parse, stringify:JSON.stringify, },});asyncfunctionqueryOrcaPool(address:string) {// We only fetch fields necessary for usconstquery=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 }}`;returnawaitgraphQLClient.request(query);}//We have to check how much tokens are present in openbook market as wellexportasyncfunctionparsePoolInfo(poolInfo) {//to load openOorders from openbookconstconnection=newConnection(rpcEndpoint,"confirmed");consttokenBalanceA=awaitconnection.getTokenAccountBalance(newPublicKey(poolInfo.tokenVaultA) );consttokenBalanceB=awaitconnection.getTokenAccountBalance(newPublicKey(poolInfo.tokenVaultB) );consttokenAmountA=tokenBalanceA.value?.uiAmount;consttokenAmountB=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 wantconstpriceInfo=awaitgetTokenPrices(poolInfo.tokenMintA,poolInfo.tokenMintB);constbaseLiquidity= tokenAmountA *priceInfo.basePrice;constquoteLiquidity= 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 asyncfunctiongetTokenPrices(base, quote) {constbaseMintPrice=await (awaitfetch(`https://price.jup.ag/v4/price?ids=${base}`)).json()constquoteMintPrice=await (awaitfetch(`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 addresconstpoolInfo=awaitqueryOrcaPool('5y2jFFA3A8GNjRnVMg8LfTHbBg7y2vivopiK8LmGRP2B');console.log(poolInfo)console.log('Parsing Pool info')awaitparsePoolInfo(poolInfo.ORCA_WHIRLPOOLS_whirlpool[0])