-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgetPoolInfo.ts
84 lines (76 loc) · 2.99 KB
/
getPoolInfo.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import {
Liquidity,
LIQUIDITY_STATE_LAYOUT_V4,
MARKET_STATE_LAYOUT_V3,
SPL_MINT_LAYOUT,
ApiPoolInfoV4,
Market,
} from '@raydium-io/raydium-sdk'
import { NATIVE_MINT } from '@solana/spl-token'
import {
Connection,
PublicKey,
} from '@solana/web3.js'
async function _formatAmmKeysById(id: string, connection: Connection): Promise<ApiPoolInfoV4> {
const account = await connection.getAccountInfo(new PublicKey(id))
if (account === null) throw Error(' get id info error ')
const info = LIQUIDITY_STATE_LAYOUT_V4.decode(account.data)
const marketId = info.marketId
const marketAccount = await connection.getAccountInfo(marketId)
if (marketAccount === null) throw Error(' get market info error')
const marketInfo = MARKET_STATE_LAYOUT_V3.decode(marketAccount.data)
const lpMint = info.lpMint
const lpMintAccount = await connection.getAccountInfo(lpMint)
if (lpMintAccount === null) throw Error(' get lp mint info error')
const lpMintInfo = SPL_MINT_LAYOUT.decode(lpMintAccount.data)
return {
id,
baseMint: info.baseMint.toString(),
quoteMint: info.quoteMint.toString(),
lpMint: info.lpMint.toString(),
baseDecimals: info.baseDecimal.toNumber(),
quoteDecimals: info.quoteDecimal.toNumber(),
lpDecimals: lpMintInfo.decimals,
version: 4,
programId: account.owner.toString(),
authority: Liquidity.getAssociatedAuthority({ programId: account.owner }).publicKey.toString(),
openOrders: info.openOrders.toString(),
targetOrders: info.targetOrders.toString(),
baseVault: info.baseVault.toString(),
quoteVault: info.quoteVault.toString(),
withdrawQueue: info.withdrawQueue.toString(),
lpVault: info.lpVault.toString(),
marketVersion: 3,
marketProgramId: info.marketProgramId.toString(),
marketId: info.marketId.toString(),
marketAuthority: Market.getAssociatedAuthority({ programId: info.marketProgramId, marketId: info.marketId }).publicKey.toString(),
marketBaseVault: marketInfo.baseVault.toString(),
marketQuoteVault: marketInfo.quoteVault.toString(),
marketBids: marketInfo.bids.toString(),
marketAsks: marketInfo.asks.toString(),
marketEventQueue: marketInfo.eventQueue.toString(),
lookupTableAccount: PublicKey.default.toString()
}
}
export const getPoolKeys = async (connection: Connection, baseMint: PublicKey) => {
try {
const res = await fetch(`https://api.dexscreener.com/latest/dex/tokens/${baseMint.toBase58()}`, {
method: 'GET',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json'
}
})
const data = await res.clone().json()
if (data.pairs.length == 0) {
return null
} else {
const raydiumPairId = data.pairs.filter((pair: any) => pair.dexId === "raydium" && pair.quoteToken.address == NATIVE_MINT.toBase58())[0].pairAddress
const poolState = await _formatAmmKeysById(raydiumPairId, connection)
return poolState
}
} catch (e) {
console.log("error in fetching price of pool", e)
return null
}
}