We often want to fetch how much liquidity is present in a pool. To achieve this,
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])