wormhole-explorer/onchain_data/src/getCoinGeckoPrices.ts

133 lines
3.8 KiB
TypeScript

import axios from "axios";
import { COIN_GECKO_EXCEPTIONS } from "./utils";
const CoinGecko = require("coingecko-api");
function sleep(milliseconds) {
const date = Date.now();
let currentDate = 0;
do {
currentDate = Date.now();
} while (currentDate - date < milliseconds);
}
//2. Initiate the CoinGecko API Client
const CoinGeckoClient = new CoinGecko(); //use justin's VIP coin gecko api key?
async function getCoinsList() {
let data = await CoinGeckoClient.coins.list();
//console.log(data)
return;
}
export async function getTokenPrice(tokenAddress) {
let tokenContractInfo = await CoinGeckoClient.coins.fetchCoinContractInfo(
tokenAddress
);
let data = tokenContractInfo["data"];
var price = 0;
try {
price = data["market_data"]["current_price"].usd;
} catch (e) {
console.log("could not find price for address=", tokenAddress);
}
return price;
}
export async function getTokenPrices(tokenAddresses) {
//only for ethereum chain
let tokenContractInfos;
try {
tokenContractInfos = await CoinGeckoClient.simple.fetchTokenPrice({
contract_addresses: tokenAddresses,
vs_currencies: "usd",
});
} catch (e) {
console.log(e);
console.log("could not find prices for addresses");
}
return tokenContractInfos["data"];
}
function getKeyByValue(object, value) {
return Object.keys(object).find((key) => object[key] === value);
}
export async function getCoinGeckoMap() {
// pull coin gecko mapping of token address to coingecko id
var coinMap;
const map_query = `https://api.coingecko.com/api/v3/coins/list?include_platform=true`;
try {
const req = await axios.get(map_query);
coinMap = req.data;
} catch (e) {
console.log(e);
console.log("could not find prices for addresses");
}
var coinMapTransformed: any[] = [];
for (let i = 0; i < coinMap.length; i++) {
const coin = coinMap[i];
const platforms = coin?.platforms;
Object.entries(platforms).forEach((entry) => {
const [platform, contractAddress] = entry;
if (contractAddress != "" && contractAddress != null) {
coinMapTransformed.push({
contractAddress: contractAddress,
coinGeckoId: coin.id,
});
}
});
}
return coinMapTransformed;
}
export async function getTokenPricesGET(
chainId: number,
platform: String,
tokenAddresses: String[]
) {
let data;
const addresses = tokenAddresses.join("%2C");
const price_query = `https://api.coingecko.com/api/v3/simple/token_price/${platform}?contract_addresses=${addresses}&vs_currencies=usd`;
//console.log(price_query)
try {
const tokenContractInfos = await axios.get(price_query);
data = tokenContractInfos.data;
} catch (e) {
console.log(e);
console.log("could not find prices for addresses");
}
// find prices included in exceptions using coin gecko id and add it back to the results
const filteredIds = COIN_GECKO_EXCEPTIONS.filter(
(x) => tokenAddresses.includes(x.tokenAddress) && x.chainId == chainId
);
const coinGeckoIds = filteredIds.map((x) => x.coinGeckoId);
const additional_data = await getTokenPricesCGID(coinGeckoIds);
let gecko_id_data = {};
for (let i = 0; i < filteredIds.length; i++) {
let cg_id = filteredIds[i];
gecko_id_data[cg_id.tokenAddress] = additional_data[cg_id.coinGeckoId];
}
return { ...data, ...gecko_id_data };
}
export async function getTokenPricesCGID(coinGeckoIds: String[]) {
let data;
const ids = coinGeckoIds.join("%2C");
const price_query = `https://api.coingecko.com/api/v3/simple/price?ids=${ids}&vs_currencies=usd`;
console.log(price_query);
try {
const tokenContractInfos = await axios.get(price_query);
data = tokenContractInfos.data;
} catch (e) {
// console.log(e);
console.log("could not find prices for ids", coinGeckoIds);
}
return data;
}