2022-11-05 04:47:54 -07:00
|
|
|
export const USDC_MINT = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'
|
|
|
|
export const USDT_MINT = 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB'
|
|
|
|
|
2022-11-05 11:13:24 -07:00
|
|
|
const apiKey: string = process.env.NEXT_PUBLIC_BIRDEYE_KEY as string
|
|
|
|
export const BIRDEYE_REQUEST_HEADER = {
|
|
|
|
'X-API-KEY': apiKey,
|
|
|
|
}
|
|
|
|
|
2022-11-05 04:47:54 -07:00
|
|
|
export const fetchChartData = async (
|
|
|
|
baseTokenMint: string,
|
|
|
|
quoteTokenMint: string,
|
|
|
|
daysToShow: number
|
|
|
|
) => {
|
|
|
|
try {
|
|
|
|
const timeTo = Math.trunc(Date.now() / 1000)
|
|
|
|
const timeFrom = timeTo - daysToShow * 86400
|
|
|
|
const interval = daysToShow === 1 ? '30m' : '4H'
|
|
|
|
const [inputResponse, outputResponse] = await Promise.all([
|
|
|
|
fetch(
|
|
|
|
`https://public-api.birdeye.so/defi/history_price?address=${baseTokenMint}&address_type=token&type=${interval}&time_from=${timeFrom}&time_to=${timeTo}`,
|
|
|
|
{
|
2022-11-05 11:13:24 -07:00
|
|
|
headers: BIRDEYE_REQUEST_HEADER,
|
2022-11-05 04:47:54 -07:00
|
|
|
}
|
|
|
|
),
|
|
|
|
fetch(
|
|
|
|
`https://public-api.birdeye.so/defi/history_price?address=${quoteTokenMint}&address_type=token&type=${interval}&time_from=${timeFrom}&time_to=${timeTo}`,
|
|
|
|
{
|
2022-11-05 11:13:24 -07:00
|
|
|
headers: BIRDEYE_REQUEST_HEADER,
|
2022-11-05 04:47:54 -07:00
|
|
|
}
|
|
|
|
),
|
|
|
|
])
|
|
|
|
|
|
|
|
const [inputData, outputData] = await Promise.all([
|
|
|
|
inputResponse.json(),
|
|
|
|
outputResponse.json(),
|
|
|
|
])
|
|
|
|
|
|
|
|
let data: any[] = []
|
|
|
|
if (Array.isArray(inputData.data.items)) {
|
|
|
|
data = data.concat(inputData.data.items)
|
|
|
|
}
|
|
|
|
if (Array.isArray(outputData.data.items)) {
|
|
|
|
data = data.concat(outputData.data.items)
|
|
|
|
}
|
|
|
|
|
|
|
|
const formattedData = data.reduce((a, c) => {
|
|
|
|
const found = a.find((price: any) => price.time === c.unixTime)
|
|
|
|
if (found) {
|
|
|
|
if ([USDC_MINT, USDT_MINT].includes(quoteTokenMint)) {
|
|
|
|
found.price = found.inputPrice / c.value
|
|
|
|
} else {
|
|
|
|
found.price = c.value / found.inputPrice
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
a.push({ time: c.unixTime, inputPrice: c.value })
|
|
|
|
}
|
|
|
|
return a
|
|
|
|
}, [])
|
|
|
|
formattedData[formattedData.length - 1].time = Math.trunc(Date.now() / 1000)
|
|
|
|
return formattedData.filter((d: any) => d.price)
|
|
|
|
} catch {
|
|
|
|
return []
|
|
|
|
}
|
|
|
|
}
|