UNPKG

@bluefin-exchange/bluefin7k-aggregator-sdk

Version:
64 lines (63 loc) 2.3 kB
import { fetchClient } from "../../config/fetchClient"; import { API_ENDPOINTS } from "../../constants/apiEndpoints"; import { NATIVE_USDC_TOKEN_TYPE, SUI_FULL_TYPE } from "../../constants/tokens"; import { normalizeTokenType } from "../../utils/token"; export async function getTokenPrice(id, vsCoin = NATIVE_USDC_TOKEN_TYPE) { try { const response = await fetchClient(`${API_ENDPOINTS.PRICES}/price?ids=${normalizeTokenType(id)}&vsCoin=${vsCoin}`); const pricesRes = (await response.json()); return Number(pricesRes?.[id]?.price || 0); } catch (_) { return 0; } } const chunkArray = (array, chunkSize) => { const chunks = []; for (let i = 0; i < array.length; i += chunkSize) { chunks.push(array.slice(i, i + chunkSize)); } return chunks; }; const MAX_TOTAL_IDS = 500; const MAX_IDS_PER_REQUEST = 100; export async function getTokenPrices(ids, vsCoin = NATIVE_USDC_TOKEN_TYPE) { try { const limitedIds = ids.slice(0, MAX_TOTAL_IDS).map(normalizeTokenType); const idChunks = chunkArray(limitedIds, MAX_IDS_PER_REQUEST); const responses = await Promise.all(idChunks.map(async (chunk) => { const response = await fetchClient(`${API_ENDPOINTS.PRICES}/price`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ ids: chunk, vsCoin, }), }); const pricesRes = (await response.json()); return pricesRes; })); const combinedPrices = responses.reduce((acc, pricesRes) => { Object.keys(pricesRes).forEach((id) => { acc[id] = Number(pricesRes[id]?.price || 0); }); return acc; }, {}); const finalPrices = limitedIds.reduce((acc, id) => { acc[id] = combinedPrices[id] || 0; return acc; }, {}); return finalPrices; } catch (_) { return ids.slice(0, MAX_TOTAL_IDS).reduce((acc, id) => { acc[id] = 0; return acc; }, {}); } } export async function getSuiPrice() { return await getTokenPrice(SUI_FULL_TYPE); }