mango-v4-ui/apis/coingecko.ts

78 lines
2.3 KiB
TypeScript
Raw Normal View History

import { Bank } from '@blockworks-foundation/mango-v4'
2023-02-23 09:28:09 -08:00
type CoingeckoOhlcv = [
time: number,
open: number,
high: number,
low: number,
2023-07-21 11:47:53 -07:00
close: number,
2023-02-23 09:28:09 -08:00
][]
export type ChartDataItem = {
time: number
price: number
inputTokenPrice: number
outputTokenPrice: number
}
2022-10-07 16:39:06 -07:00
export const fetchChartData = async (
2022-11-18 11:11:06 -08:00
baseTokenId: string | undefined,
inputBank: Bank | undefined,
2022-11-18 11:11:06 -08:00
quoteTokenId: string | undefined,
outputBank: Bank | undefined,
2023-07-21 11:47:53 -07:00
daysToShow: string,
flipPrices: boolean,
2023-02-23 09:28:09 -08:00
): Promise<ChartDataItem[]> => {
if (!baseTokenId || !quoteTokenId) return []
2023-08-08 06:26:12 -07:00
const baseId = flipPrices ? baseTokenId : quoteTokenId
const quoteId = flipPrices ? quoteTokenId : baseTokenId
2022-11-04 05:39:10 -07:00
try {
const [inputResponse, outputResponse] = await Promise.all([
fetch(
`https://api.coingecko.com/api/v3/coins/${baseId}/ohlc?vs_currency=usd&days=${daysToShow}`,
2022-11-04 05:39:10 -07:00
),
fetch(
`https://api.coingecko.com/api/v3/coins/${quoteId}/ohlc?vs_currency=usd&days=${daysToShow}`,
2022-11-04 05:39:10 -07:00
),
])
2022-10-07 16:39:06 -07:00
2023-02-23 09:28:09 -08:00
const [inputTokenData, outputTokenData]: [CoingeckoOhlcv, CoingeckoOhlcv] =
await Promise.all([inputResponse.json(), outputResponse.json()])
2022-10-07 16:39:06 -07:00
2023-02-23 09:28:09 -08:00
if (Array.isArray(inputTokenData) && Array.isArray(outputTokenData)) {
const parsedData: ChartDataItem[] = []
for (const inputTokenCandle of inputTokenData) {
const outputTokenCandle = outputTokenData.find(
2023-07-21 11:47:53 -07:00
(outputTokenCandle) => outputTokenCandle[0] === inputTokenCandle[0],
2023-02-23 09:28:09 -08:00
)
if (outputTokenCandle) {
2023-08-03 03:34:57 -07:00
parsedData.push({
time: inputTokenCandle[0],
price: outputTokenCandle[4] / inputTokenCandle[4],
inputTokenPrice: inputTokenCandle[4],
outputTokenPrice: outputTokenCandle[4],
})
2022-11-04 05:39:10 -07:00
}
2022-10-07 16:39:06 -07:00
}
if (inputBank && outputBank) {
const latestPrice = flipPrices
? outputBank.uiPrice / inputBank.uiPrice
: inputBank.uiPrice / outputBank.uiPrice
const item: ChartDataItem[] = [
{
price: latestPrice,
time: Date.now(),
inputTokenPrice: inputBank.uiPrice,
outputTokenPrice: outputBank.uiPrice,
},
]
return parsedData.concat(item)
} else return parsedData
2023-02-23 09:28:09 -08:00
} else {
return []
}
2022-11-04 05:39:10 -07:00
} catch {
return []
}
2022-10-07 16:39:06 -07:00
}