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
Was this helpful?