@bluefin-exchange/bluefin7k-aggregator-sdk
Version:
64 lines (63 loc) • 2.3 kB
JavaScript
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);
}